定义数组a[10] *p,为什么*p=a和p=a效果一样

如题所述

方式不一样,目的相同。
int a[10],*p=a;//这是定义时初始化
int b[10],*pb;
pb=b; //这是定义了指针变量pb,再给pb赋值。追问

在定义时,*p=&a[0]也是成立的,但是在定义之后比如
int a[5] ,*p;
*p=a或者*p=&a[0]就会提示出错
能解释一下吗

追答

对啊,a[0]这是元素,所以要加&运算符,a本身就是数组的首地址,不能加&
int a[5] ,*p; //这是声明语句,这里的*是指针类型标识符,表示p是指针变量
*p=5;//这是操作语句,将5赋值p指针的单元,这里的*是间接访问运算符,所处的位置不同,
//则完成的功能不同
所以:
*p=a; //这个语句中,a为地址,*p为取值运算,类型不匹配

追问

貌似理解了,两个*不一样。在追问一下下,取值运算符是间接访问运算符,是这个意思吧。

追答

取值运算符与间接访问运算符,同一个意思,表述不同,
因为*p是通过p的值取得其所指单元的值,所以*也称为间接访问运算符,是以其取值方式来表述的

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-21
a即是数组名,也是数组的首地址,也是一个指针型,这表示把p是一个指针型,*p=a表示把数组的地址付给p,p=a 这表示数组的首地址给p追问

*p=a 表示把数组的地址交给p
p=a表示吧数组的首地址交给p………………表示不是很理解 a不就是代表首地址吗?为什么还代表地址。再有*p应该表示指针p所指向的内容,而a是地址,为什么把一个地址赋给内容成立呢?而且输出的是数组的内容而不是数组的地址。
同时,
在定义时,*p=&a[0]也是成立的,但是在定义之后比如
int a[5] ,*p;
*p=a或者*p=&a[0]就会提示出错
能解释一下吗

第2个回答  2012-09-21
问题:在定义时,*p=&a[0]也是成立的,但是在定义之后比如
int a[5] ,*p;
*p=a或者*p=&a[0]就会提示出错
是这样的,p是指针,p里面存的值应该是a的地址,*p表示对应这个地址单元里面存的值
而*p=a,就成了,*p所指向的地址单元里面存的值是a[0]的地址,就不是a[0]的值了
*p=&a[0],跟上面一样的道理,*p所指向的地址单元里面存的值是a[0]的地址本回答被网友采纳
相似回答