月望村吧 关注:3贴子:740
  • 8回复贴,共1

指针的多级关系

只看楼主收藏回复

#include <iostream>
using namespace std;
// 定义一个结构体类型
struct Person {
string name;
int age;
// 构造函数
Person(const string& n, int a) : name(n), age(a) {}
};
int main() {
// 创建一个 Person 类型的指针数组,长度为3
Person* people[3];
// 动态分配内存并初始化每个指针
people[0] = new Person("Alice", 30);
people[1] = new Person("Bob", 25);
people[2] = new Person("Charlie", 20);
// 输出每个人的信息
for (int i = 0; i < 3; ++i) {
cout << "Name: " << people[i]->name << ", Age: " << people[i]->age << endl;
}
// 新增的代码
const Person ** pp = people;
// 释放分配的内存
for (int i = 0; i < 3; ++i) {
delete people[i];
}
return 0;
}


IP属地:江苏1楼2024-06-11 11:03回复
    理解 const Person ** pp = people
    指针数组 people 的含义:
    Person* people[3] 是一个包含三个指向 Person 对象的指针的数组。
    它实际上是一个数组,其中每个元素是类型为 Person* 的指针。
    用图示表示,people 可以被理解为:


    IP属地:江苏2楼2024-06-11 11:04
    回复
      people[0] -> 指向 Person 对象 ("Alice", 30)
      people[1] -> 指向 Person 对象 ("Bob", 25)
      people[2] -> 指向 Person 对象 ("Charlie", 20)


      IP属地:江苏3楼2024-06-11 11:04
      回复
        const Person ** pp 的含义:
        const Person ** pp 是一个指向 const Person* 类型的指针。
        也就是说,pp 是一个指向 Person* 的指针的指针。
        通过这种声明,pp 可以指向一个指针数组的第一个元素。


        IP属地:江苏4楼2024-06-11 11:04
        回复
          将 people 赋值给 pp:
          people 是一个 Person* 的数组,当我们使用它时,它会退化为指向 Person* 的指针,即 Person** 类型。
          const Person ** pp = people; 的含义是:pp 现在指向 people 数组的第一个元素。
          由于 people 是 Person* 的数组,people 本身是 Person** 类型,这种类型兼容赋值给 const Person**。


          IP属地:江苏5楼2024-06-11 11:05
          回复
            const 的作用:
            const 限定符表明 pp 指向的 Person* 是 const 的,也就是说不能通过 pp 修改 people 数组中的 Person* 指针值,但可以修改 Person 对象的内容。
            它确保了我们不能通过 pp 来改变 people 数组中指针的内容(即,不能让 people[0] 指向另一个 Person 对象),但是可以读取或通过其他途径修改 Person 对象。


            IP属地:江苏6楼2024-06-11 11:05
            回复
              具体操作
              让我们看看 pp 如何与 people 互动:
              pp 现在指向 people 数组的第一个元素,所以 *pp 与 people[0] 相同。
              pp 也可以被递增,以访问数组的后续元素,比如 *(pp + 1) 与 people[1] 相同。
              下面是一些具体的操作示例:


              IP属地:江苏7楼2024-06-11 11:05
              回复
                cout << "Access via pp: " << (*pp)->name << endl; // 输出 people[0] 的 name, 即 "Alice"
                pp++; // 移动指针到下一个元素
                cout << "Access via pp: " << (*pp)->name << endl; // 输出 people[1] 的 name, 即 "Bob"


                IP属地:江苏8楼2024-06-11 11:05
                回复
                  总结
                  const Person ** pp = people; 这行代码让 pp 指向了 people 数组的第一个元素。
                  pp 是一个指向 Person* 的指针的指针,使得我们可以通过 pp 访问 people 数组的内容,但不能修改 people 数组中的指针。
                  这种多级指针的操作在处理复杂的数据结构或接口时非常有用。
                  这样可以让你灵活地操作指针数组和它们所指向的内容,同时还能保证一定的安全性和防止误操作。


                  IP属地:江苏9楼2024-06-11 11:05
                  回复