为什么我应该使用双指针变量来接收另一个指针的地址(&ptr1)

use*_*058 6 c pointers pointer-to-pointer

int num = 45,*ptr1,*ptr2;
ptr1=#
ptr2=&ptr1;
printf("%d\n",*ptr1);
Run Code Online (Sandbox Code Playgroud)

我一直在考虑这个问题,但找不到理解它的方法,为什么&ptr1不能ptr2在第3行分配,&ptr1是指针的地址,这个地址与其他地址没有区别,如地址比如说整数

int a=1;
ptr2=&a;
Run Code Online (Sandbox Code Playgroud)

这意味着我可以为指针分配一个整数的地址,但不能指向指针的指针地址,这两个"地址"之间的差异是否可能使它们不同?公共变量的地址可以分配给单个指针,但是指针的地址不能分配给单个指针?

我知道正确的方法是使用双指针来声明ptr2,但为什么单个指针不能?

Yu *_*Hao 3

简而言之,指针不是地址,它们是表示具有类型的地址的变量。void *因此,这些类型必须与要分配的指针兼容(通用指针除外)。

ptr2 = &ptr1;
Run Code Online (Sandbox Code Playgroud)

ptr1具有 类型int *,因此&ptr1具有 类型int **,它与 不同ptr2,后者具有 类型int *

参考:C99 6.5.16.1简单赋值

两个操作数都是指向兼容类型的限定或非限定版本的指针,并且左侧指向的类型具有右侧指向的类型的所有限定符。