我是用C编程的新手,我正在努力理解指针的概念.然而,一些印刷报表的结果相当令人困惑,我在网上找不到合适的答案.
因此,我在C中运行以下main
函数:
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
).如有任何帮助,我们不胜感激