取址符号&与间接访问操作符*的区别:首先区分一个是取址,一个是间接访问(文字解释不清,还是用代码)
int main(void)
{
int m=5;
int *p=&m;
}
看这两行代码声明,我都赋了初值(动态情况下系统不会去初始化)。声明m时系统就为m分配了一块内存空间,这就意味着从地址的角度看,m有一个唯一标识它的地址,如2686728,就如房间号一样,这个地址上存的内容就是5.p的类型是int*,表示int型的地址,限定了p的类型是一个地址,并且是int型的地址,把char或long型的地址给p,p是拒绝的。始终强调*是间接访问操作符,我要访问p所存地址的内容,p=2686728,但*p表示我去2686728这个地方访问,最终得到5这个结果。m我访问到的直接就是m的内容5.
注意你此时只声明了&m,那&&m存在吗?当然不存在,不要以为有了m,我就会有m的地址的地址。因为系统只给m分配了地址,并没有给&m分配地址。
int **pp = &p;//正确
int **pp = &&m;//报错,invalid conversion from 'void *' to 'int *'
从上面第二句看出,虽然**pp是指针的指针,指向地址的地址,但&&m是不存在的,系统怎么可能无中生有呢!
1 int b = **pp; //正确,**pp=5 2 int b=*pp; //error:invalid conversion from 'int *' to 'int' 3 int b=pp; //error: invalid conversion from 'int **' to 'int'
再来看看这三条语句:**就做两次间接访问就好了。虽然地址是我们看到的2686728这一串数字,误认为是整形值,但请记住这只是一串数字,它使用的方式是int*和int**,就不能赋给int型,也不可能是char*。
综上:指针要初始化,否则成为野指针,不能无中生有,系统看到的只是01数字串,我们分类型在于使用方式不同,系统看见的都是一样的。
有错误的地方、理解不对的地方请大家多指正。我总是在**和*之间迷糊,所以写小程序来帮助我理解
浙公网安备 33010602011771号