指向指针地址的指针

时间:2018-11-01 03:55:08

标签: c pointers pointer-to-pointer

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

这是我的代码

#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

对不起,我的英语不好

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

  

为什么numPtr2的地址与numPtr1,numPtr2不同?

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

答案 2 :(得分:0)

numptr2指向numptr1变量,numptr1指向num。 因此,将在numptr2中存储numptr1的地址,并在numptr1中存储num的地址 两个(numptr1,num)地址不同。 这就是您获得不同地址的原因。

答案 3 :(得分:0)

关于 [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

<头>
姓名 数量 numPtr1 numPtr2
价值 10 0115FC14 0115FC08
内存位置 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);

}