初学者关于指针的疑惑

请教:

img


为什么地址不同输出的值是一样的??
还有使用&取的地址为什么和int指向数组的指针的地址不一样啊?

int p = arr[0];
&p

int *q = arr;
这里&p和 指针q打印出来的地址不一致的原因是
因为int p = arr[0]; 这一步只是一个赋值操作,这里定义了一个新的变量p 然后将arr[0]这个元素的值赋值给了p, 这个时候p和arr[0]只是存储的值是一样的,但是地址没有任何关联,因为p和arr[0]是两个不同的int类型变量 p的地址和arr[0]的地址也是不同的
int *q = arr;
arr指向数组的起始地址,我们知道arr[0]就是数组的第一个元素,所以数组的起始地址就是第一个元素的内存地址即 arr等价于&arr[0], q=arr 等价于 q = &arr[0]
再回到上面
int p = arr[0];

int *q = &arr[0]
因为p和arr[0]是不同的变量 所以&p和q打印出来的地址必然不会一样

这里的指针q是指向arr数组的,你可以这样理解,类比一下:有a b 两个变量,他俩的地址不同,但是都赋值2,他俩的输出也一样
而这里的q虽然和arr数组不同,但是q里面储存的是arr的地址,所以如果*q,就是获取了arr的值,所以就是一样的

第二个,应该是你有一个赋值的过程,也就是p = a[0],这是新建了一个变量,把a[0]的值赋给了p,这个和a的地址无关,只是用了它的值,所以导致了你看到的

img


看这一句,指针p用于存储地址,这一句说明指针p存储了a[0]的地址
1、直接输出p,输出的是p的值,也就是a[0]的地址
2、而输出&p,输出的p的地址,输出的是指针变量p的地址。

虽然地址,由于两者存的值是一样的,因此输出值结果相同。

如有帮助,还请帮忙点下采纳!感谢!