【问题标题】:pointer to pointer address指向指针地址的指针
【发布时间】:2018-11-01 03:55:07
【问题描述】:

我有一个关于指针指针的问题。

这是我的代码

#include <stdio.h>

void main()
{
    int num=10;
    int *numPtr1;
    int **numPtr2;

    numPtr1 = &num;
    numPtr2 = &numPtr1;
    printf("%d\n", num);
    printf("%d\n", *numPtr1);
    printf("%d\n", **numPtr2);
    printf("%p\n", &num);
    printf("%p\n", numPtr1);
    printf("%p", numPtr2);
}

为什么numPtr2的地址和numPtr1、numPtr2不一样? 例如,让 num 的地址为 0x7fffaca780b4。然后当我运行这段代码时,输​​出是

10
10
10
0x7fffaca780b4
0x7fffaca780b4
0x7fffaca780b8

对不起我的英语不好

【问题讨论】:

  • 你为什么不让numPtr1指向别的东西并再次运行你的程序。也许它会变得清晰。
  • numPtr1 的地址是numnumPtr2 的地址是numPtr1,因此*numPtr2num 的地址。
  • 这些打印语句中的大多数都是未定义的行为,因此毫无意义。 %d 的参数必须具有 int 类型。 %p 的参数必须具有 void * 类型。

标签: c pointers pointer-to-pointer


【解决方案1】:

numPtr1numPtr2 是两个不同的变量。因此,无论它们指向何处,这些变量的位置都会有所不同。

【讨论】:

    【解决方案2】:

    numptr2 指向 numptr1 变量,numptr1 指向 num。 所以在numptr2 中将存储numtr1 的地址& 在numptr1 中将存储num 的地址 两个(numptr1,num) 地址不同。 这就是你得到不同地址的原因。

    【讨论】:

      【解决方案3】:

      为什么numPtr2的地址和numPtr1、numPtr2不一样?

      每个变量在内存中都有自己的地址,因此它们的内容可能相同但它们的地址不能相同否则就无法区分它们。

      【讨论】:

        【解决方案4】:

        关于 [num]
        [num] 的值 = 10
        [num] 的内存位置 = 0115FC14

        关于 [numPtr1]
        取消引用时 [numPtr1] 的值 = 10
        [numPtr1] 的地址持有 = 0115FC14
        [numPtr1] 的内存位置 = 0115FC08

        关于 [numPtr2]
        取消引用一次时 [numPtr2] 的值 = 0115FC14(*numPtr2)
        取消引用两次时 [numPtr2] 的值 = 10(**numPtr2)
        [numPtr2] 持有的地址 = 0115FC08(numPtr2) 等于 [numPtr1] 的内存位置 = 0115FC08(&numPtr1)
        [numPtr2] 的内存位置 = 0115FBFC

        Name num numPtr1 numPtr2
        Value 10 0115FC14 0115FC08
        Memory location 0115FC14 0115FC08 0115FBFC

        这里是代码

        #include <stdio.h>
        
        int main(void)
        {
            int a = 5;
            int* a_ptr1 = &a;
            int** a_ptr2 = &a_ptr1;
            puts("***About [a]***");
            printf("value of [a] = %d\nmemory location of [a] = %p\n\n", a, &a);
        
            puts("***About [a_ptr1]***");
            printf("value of [a_ptr1] when it dereferenced = %d\n", *a_ptr1);
            printf("address of [a_ptr1] is holding = %p\n", a_ptr1);
            printf("memory location of [a_ptr1] = %p\n\n", &a_ptr1);
        
            puts("***About [a_ptr2]***");
            printf("value of [a_ptr2] when it dereferenced once = %p(*a_ptr2)\n", *a_ptr2);
            printf("value of [a_ptr2] when it dereferenced twice = %d(**a_ptr2)\n", **a_ptr2);
            printf("address of [a_ptr2] holding = %p(a_ptr2) ", a_ptr2);
            printf("is equals to memory location of [a_ptr1] = %p(&a_ptr1)\n", &a_ptr1);
            printf("memory location of [a_ptr2] = %p\n\n", &a_ptr2);
        
        
            printf("Name\t\t[a]<---------[a_ptr1]<-------[a_ptr2]\n");
            printf("Value\t\t%d            %p        %p\n", a, a_ptr1, a_ptr2);
            printf("Address\t\t%p     %p        %p\n", &a, &a_ptr1, &a_ptr2);
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-11
          • 2012-10-18
          相关资源
          最近更新 更多