我是 C 编程新手,我正在尝试理解指针的概念。然而,一些打印语句的结果相当混乱,我无法在网上找到合适的答案。
所以,我在 C 中运行以下主要方法:
int main() {
int a[] = {1, 2, 3, 4, 5}; // a points to the address of a[0]
int *p = a; // p points to the same address as a
int **pp = &p; // points to p
int *p2[] = {a, a+1, a+2, a+3, a+4}; // points a
int **pp2 = p2; // points to the same address as p2
printf(" a: %p, *a: %p\n", a, *a);
printf(" p: %p, *p: %p\n", p, *p);
printf(" pp: %p, *pp: %p, **pp: %p\n", pp, *pp, **pp);
printf(" p2: %p, *p2: %p, **p2: %p\n", p2, *p2, **p2);
printf("pp2: %p, *pp2: %p, **pp2: %p\n", pp2, *pp2, **pp2);
return 0;
}
使用
gcc main.c -o main
和 ./main
我得到以下输出:
a: 0061FF04, *a: 00000001
p: 0061FF04, *p: 00000001
pp: 0061FEEC, *pp: 0061FF04, **pp: 00000001
p2: 0061FEF0, *p2: 0061FF04, **p2: 00000001
pp2: 0061FEF0, *pp2: 0061FF04, **pp2: 00000001
表示
a
和 p
都指向 a[0]
且 pp
指向 p
,这是预期的行为。 p2
和pp2
指向与a
相同的地址也是有道理的,但我想不出原因,为什么打印出a
和p
以及p2
和pp2
产生相同的地址(分别为 0061FF04 和 0061FEF0)。任何帮助表示赞赏
&array[0]
相同,并且它具有指向数组元素类型的指针类型。
&array
引用与
array
相同的内存位置,但它具有不同的类型(指向数组的指针)。
p
保存着
a
第一个元素的引用。因此,打印
a
(当它衰减到其第一个元素的引用时)和
p
将打印相同的地址。
pp
持有
p
的参考。
*pp
将引用
a
的第一个元素
p2
是一个指针数组,保存数组
a
元素的引用(因为从点 1 开始衰减)
pp2
保存数组
p2
第一个元素的引用(再次衰减)。因此,打印
p2
和
pp2
将为您提供相同的地址。