若int a=5, *p=&a; 1.那么 a ,&a, p, *p的区别是什么? 2.如果&*p, *&a 等价于 p, a 是不是还等价于&a

若int a=5, *p=&a;
1.那么 a ,&a, p, *p的区别是什么?
2.如果&*p, *&a 等价于 p, a
是不是还等价于&a , *p?
如果正确,是不是p=&a a=*p?

先上结论:

对于int a[5],*p;

p=a; 或p=&a[0]是正确的

p=&a严格来说是错误的

首先要搞清楚a与&a的区别:a表示数组首元素的首地址,即元素a[0]的地址;&a表示整个数组的地址。二者的值是相同的,但意义并不一样。正如成都市政府与四川省政府的地址都在成都,但二者表示的含义不同。

如下图所示,a表示a[0]的地址

&a则表示整个数组的地址

二者的值之所以相同,因为地址是取自第一个字节的地址,数组元素a[0]的第一个字节与整个数组的第一个字节显然是相同的。

a与&a[0]及&a的值如下:

1244980,1244980,1244980

a+1与&a[0]+1值如下:

1244984,1244984

但&a+1的值为1245000。

a+1与&a[0]+1都是表示下一个数组元素的地址,以元素为单位相加,地址值+4。而&a+1表示下一个数组的地址,以数组为单位相加,地址值+20.

所以,p=a; 或p=&a[0]是正确的,表示指针p指向数组的首元素。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-01-16
int a=5, *p=&a;
首先,运算符你要懂 &取内存地址 *从内存地址取数据
&a表示a这个变量的内存地址,是十六进制数,假设是Ox2455ffcc
*p=&a; 把&a也就是Ox2455ffcc这个值存入p所指向的内存。p是另一个内存地址,假设是 Ox47512AAFF,可见,p是指针的指针,p指向的不是普通值,而是一个内存地址。
打个比方,内存空间是抽屉,p是第一个抽屉的位置,*p表示抽屉里的钥匙,*p=&a,&a为第二个抽屉的位置,所以这把钥匙可以打开第二个抽屉,a是第二个抽屉里的物品。
总之,一块内存空间有两个值:一个是其本身的地址,一个是里面存储的数据。
*地址==数据 &数据==地址本回答被提问者采纳
第2个回答  2011-01-16
a是整数变量,值为5
&a是a的地址,比如8000(之类的)
p是指针,int *p=&a;是让p指向a,也就是p的值是a的地址8000,但注意这是声明指针。用的时候直接用p就行了。
*p在声明的时候表明p是指针,在用的时候指的是p指向的东西,也就是a。

int *p=&a;
*p=10; //此时这一赋值语句把a的值改为10了。注意指针声明和指针使用的时候*的区别。
第3个回答  2011-01-16
1.a指的是5,&a指的是a=5这个数据的存放地址,p值是指针,指向a的地址。
2. 正确,int a=5, *p=&a;这一句中的“*”是定义指针时必须有的,实际上就是p=&a,a=*p;
譬如我们这样赋值b=a;与b=*p;是同一结果,b的值都是5.
并且*&p=*(&a)=*p=a。&*p=&(*p)=&a=p.
楼主觉得有道理吗?
第4个回答  2011-01-15
1.那么 a ,&a, p, *p的区别是什么?
a指的是a这个字符,&a指的是a的存放地址,p是字符,*p值是指针。
2.如果&*p, *&a 等价于 p, a
是不是还等价于&a , *p?
如果正确,是不是p=&a a=*p?
首先,&*p这个写法是非法的,你是不是想问第二句是什么意思啊,它指p指向a,简单说,就是令p=a。
相似回答