关于c语言指针的一些问题

1.*p=a
2,*p=a[0]
3.*a=*p 这3中写法都对吗,到底指针是怎么等价的

首先 你要告诉我 a 的类型 如果 a 是非指针型变量 那么 *p=a 是正确的 他表示 指针p 指向的单元 内容为 a (当然 如果a是数组名的 因为数组名也是指针型的 所以 就是错误的) 2,如果a 数组名 那么就是正确的 他表示 指针p 指向的单元 内容为 a [0] 3、a 是数组名的时候是正确的 他表示 a[0] = 指针p所指单元的内容。
其实 理解指针的话 有一个很好的 方法 你可以把 指针变量p当做一个数组名 那么*p 也就表示 p[0] p也就表示指针 p 然后你就会知道该如何赋值了 。
希望对你有所帮助追问

哦那再问你个问题1.*(*(p+i)+j)表示什么,*(p+i)+j又表示什么,这两个区别是? 2.那*(p+i+j)的意思和*(*(p+i+j))的意思,;两个区别?

追答

1.*(*(p+i)+j)表示 p[i][j] ,*(p+i)+j 表示 p[i]+j 如果p是二维数组 那么,*(p+i)+j 就表示指向 p[i][j] 的指针 2.那*(p+i+j)的意思是:一维数组 p[i+j]
和*(*(p+i+j))的意思是:p[i][j]; 两个区别 *(p+i+j)是单指针 即一维数组名 *(*(p+i+j)) 表示双重指针 即二维数组名 (二维数组名,指向一维数组p[0],即0行首地址)

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-12-17
首先回答你的问题:
*p=a // 当a是一个和p同类型的非指针变量时成立
2,*p=a[0] // 当a是一个与p同类型的数组时成立
3.*a=*p // 当a是一个和p同类型的指针时成立

因此这三种写法可以都认为是对的

1. 指针在被定义的时候,为其赋值要把它当做地址来处理。例如
int a = 0;
int *p = &a;
2. 除了定义的时候,其他的地方,不加星号的指针变量表示的是地址,加星号的表示的是该地址中的内容,例如
int a = 0;
int *m = &a;
int *p;
p = m; // 表示地址
*p = 1; // 表示该地址中的内容,实际就是a的值追问

还是有些不理解,你说除了定义int *p ,+*是内容,不加是地址 那*p=a这是内容,那a是什么???

追答

a必须也是一个非指针类型的变量
如果p是int *p,那么a就是int a

追问

哦那再问你些问题1.*(*(p+i)+j)表示什么,*(p+i)+j又表示什么,这两个区别是? 2.那*(p+i+j)的意思和*(*(p+i+j))的意思,两个区别?

追答

1. *(*(p+i)+j)是一个二级指针,表示p+i+j这个地址中的地址中的(地址中装着地址)内容,可以理解为二维数组p的第i行第j列的内容,等同于p[i][j],*(p+i)+j很自然就表示的是p[i][j]的地址,相当于&p[i][j]
2. 还是一级和二级指针的问题,前者是一维,后者是二维

楼主对指针的理解还存在较大问题,需要多看下教材,最好是能看一下带配图的讲解会比较清楚一些,这是C语言的精华,需要认真学习

本回答被提问者和网友采纳
第2个回答  2012-12-17
指针,指向的总是一个地址,而指针本身也是一个变量(当然也有常指针),用来指向一个我们希望的地址,从而对这个希望的地址的所存的内容进行读写。以第一个*p=a为例, p,a都是占有内存的,*p是在对p所指向的内存进行操作,如果是p=a,这就是在对指针本身进行操作,将p指向另外一个地址。所以看上面的3个表达式,都是在对指针所指向的地址的内容在进行操作。理解指针,关键要理解地址
第3个回答  2012-12-17
p是指针变量,存的是另一个变量的内存地址。
*p指的是p的内存变量里所存的值。
1. *p = a; //说的是将a的值赋给指针变量p里的内存地址里。
2. *p = a[ 0 ];//说的是将数组a[ 0 ] 的值赋给指针变量p里的内存地址里(p的内存地址不一定是a[ 0 ]的内存地址。
3. *a = *p;//说的是指针p的内存地址里的值赋给指针a的内存地址里。(a 和p不一定指的是同一个内存地址。
第4个回答  2012-12-17
1.*p=a 指针p指向的地址,里面的值=a
2,*p=a[0] 指针p指向的地址,里面的值=a[0]
3.*a=*p 指针a指向的地址,里面的值=指针p指向的地址里面的值
指针只是保存地址的东东
相似回答