在 C 中打印指针本身

问题描述 投票:0回答:1

我是 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)。任何帮助表示赞赏

c pointers
1个回答
0
投票
  1. C中的数组衰减为引用数组第一个元素的指针 - 与&array[0]
    相同,并且它具有指向数组元素类型的指针类型。
  • &array
     引用与 
    array
     相同的内存位置,但它具有不同的类型(指向数组的指针)。
  1. p
     保存着 
    a
     第一个元素的引用。因此,打印 
    a
     (当它衰减到其第一个元素的引用时)和 
    p
     将打印相同的地址。
  2. pp
     持有
    p
     的参考。 
    *pp
     将引用 
    a
     的第一个元素
    
  3. p2
     是一个指针数组,保存数组 
    a
     元素的引用(因为从点 1 开始衰减)
  4. pp2
     保存数组
    p2
    第一个元素的引用(再次衰减)。因此,打印 
    p2
    pp2
     将为您提供相同的地址。
© www.soinside.com 2019 - 2024. All rights reserved.