我想问一个关于C++中指针和数组的问题。
int a[10];
int *p1; p1 = &a[0];
int *p2; p2 = a;
int (*p3)[10]; p3 = &a;
p1、p2、p3 有什么区别? 它们非常困惑。
最佳答案
首先,a
是一个包含 10 个 int
的数组。这是简单的部分。
p1
是“指向int
的指针”。您正在为其分配 &a[0]
的值。这采用 a
的第一个元素的地址。所以 p1
现在指向 a
的第一个元素。
p2
也是“指向int
的指针”。您正在将 a
直接分配给它。在这种情况下,必须进行称为数组到指针转换的标准转换。基本上,数组可以转换为指向其第一个元素的指针。您正在将此转换的结果分配给 p2
。所以 p2
也是指向 a
的第一个元素的指针。
p3
是“指向 10 个 int
数组的指针”。您正在获取数组 a
的地址并将其分配给此指针。所以现在这个指针指向数组本身(不是它的第一个元素)。
您可能会想“嗯,第一个元素与数组的地址相同,那有什么区别呢?”事实上,当您尝试递增指针时,您会注意到差异。递增 p1
或 p2
将为您提供指向数组第二个元素的指针。递增 p3
将为您提供指向下一个 10 个 int
数组的指针(实际上并不存在)。
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ int │ int │ int │ int │ int │ int │ int │ int │ int │ int │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
^
└── p1, p2, p3
因此,如果您按照您的描述从所有指向开始,然后递增它们,您将得到:
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬┄
│ int │ int │ int │ int │ int │ int │ int │ int │ int │ int │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴┄
^ ^
└── p1, p2 └── p3
关于c++ - 关于 C++ 中的指针和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15839614/