指针指针

kma*_*mad 4 c pointers

我正在涉及c指针,无法解释以下代码:

int main()
{
    int i = -3; 
    int *ptr;
    int **ptr2;
    int ***ptr3;
    ptr = &i; 
    ptr2 = &ptr;
    ptr3 = &ptr2;
    printf("ptr = %p\n",(void *)ptr);
    printf("&ptr = %p\n",(void *)&ptr);
    printAddr(&ptr);
    printAddr2(&ptr2);
    printAddr3(&ptr3);
    return 0;
}

void printAddr(int **num)
{
    printf("address of int ** = %p\n", (void *)&num);
}

void printAddr2(int ***num)
{
    printf("address of int *** = %p\n", (void *)&num);
}
void printAddr3(int ****num)
{
    printf("address of int **** = %p\n", (void *)&num);
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

ptr = 0xbf9d64a0 
&ptr = 0xbf9d64a4
address of int ** = 0xbf9d6490
address of int *** = 0xbf9d6490
address of int **** = 0xbf9d6490
Run Code Online (Sandbox Code Playgroud)

我怀疑为什么要解决(address(int)) == address(address(address(int)))

非常感谢您的澄清.

我发现这个问题是相关的:

递归指针

但作者明确指出它们是平等的.

Dan*_*her 5

void printAddr(int **num)
{
   printf("address of int ** = %p\n",(void *)&num);
}
Run Code Online (Sandbox Code Playgroud)

这将打印出函数收到的传入值副本的地址.这些可能全部分配在堆栈的相同位置,因为所有这些函数只接受一个参数,并且调用之间不会发生分配.

如果你想看到指针的地址main,你应该直接打印它们main或有一个功能

void printAddress(void* p) {
    printf("%p\n", p);
}
Run Code Online (Sandbox Code Playgroud)

并称之为

printAddress(&ptr3);
Run Code Online (Sandbox Code Playgroud)

等等