c语言的问题 int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; int (*p)[4]; p = a;

以上为定义,为啥不能使p[0] = p[1];

int (*ptr)[3]=a这句,将a的首地址赋值给了ptr,ptr表示的是指向一个含有三个Int的数组的指针,

*((ptr+1)[2])等价于*((ptr+1)+2),等价于*(ptr+3),这表示从数组a的首地址向后移动3个单位,每个单位为一个含有3个Int的数组,所以一共向后移动了9个单位,即得出运行结果10!


要想正确表达a[1][2],应该是(*(ptr+1))[2],数组的运算符[ ]比间值运算符*的优先级高,(*(ptr+1))[2]表示a向后移动一个单位即三个Int,此时ptr指向4,再往后移动2个Int指向6。


其实遇到这类问题画内存结构图比较容易理解了


温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-15
因为p[0]和p[1]分别指向4个整数
如果你是需要将p[1]指向的4个整型数据一次性赋值给p[0]指向的4个单元,那么c语言没有这么简单的赋值,只好编个程序一个一个地赋值;
如果你是需要把p[0]指向p[1],那么你可以写:p[0]=&p[1];本回答被提问者和网友采纳
第2个回答  2013-04-13
我试了,p[0]为不可修改的左值。
只知道这个语句本身是有问题的,p[1]是依赖p[0]的。p[0]怎么可能由p[1]赋值呢?
或许汇编的角度更有说服力。期待正解!

...int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; int (*p)[4...
int (*ptr)[3]=a这句,将a的首地址赋值给了ptr,ptr表示的是指向一个含有三个Int的数组的指针,((ptr+1)[2])等价于*((ptr+1)+2),等价于*(ptr+3),这表示从数组a的首地址向后移动3个单位,每个单位为一个含有3个Int的数组,所以一共向后移动了9个单位,即得出运行结果10!要想正确...

C语言a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}表示把里面的数字分成
main() {int a[5]={1,2,3,4,5},b[4]={6,7,8,9},*p=a,*q=b\/\/p指向a的首地址,即1,q指向b,即6 p+=2;q+=3;\/\/p地址后移2位,指向3,q同理指向9 *p=*(q)+3;\/\/赋值语句,将q指向的内容加3赋给p,则p指向的值3变成12,q依旧为9 q--;\/\/q地址前移1位...

...int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}定义之后,元素a[1][0...
所以a[1][0]是第5个数,即5,选b

...={1,2,3,4,5,6,7,8,9},*p; void main() { p=(int*)malloc(sizeof...
a[1][0]~a[1][2] 4 5 6 a[2][0]~a[2][2] 7 8 9 void main(){ p=(int*)malloc(sizeof(int));\/\/ 分配一块内存,其地址赋值给p(全局变量)f(p,a);\/\/调用函数 printf("%d\\n",*p);\/\/ 这里p是全局变量,指向分配的那块内存,所以*p的值是5 system ("pause...

C语言问题 若有说明int a[][4]={1,2,3,4,5,6,7,8,9};,则数组a第一维
若有说明int a[][4]={1,2,3,4,5,6,7,8,9};则数组a第一维是3。定义数组并赋值时C语言规定下标是这样的,a[n]中的n个元素应该是a[0]...a[n-1]。。因此int a[][4]的写法就是表示,第一维大小没限制,但是第二维数组大小就是4,也就是int a[][4]={{1,2,3,4...

c语言编写一个程序,实现一个3×4矩阵转置。
\/\/参考代码#include<stdio.h> int main() { int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},b[4][3]; int i,j; for(i=0;i<3;i++) for(j=0;j<4;j++) b[j][i]=a[i][j]; for(i=0;i<4;i++) { for(j=0;j<3;j++) printf("%2d ",b[i][...

int a[ ][3]={1,2,3,4,5,6,7,8,9,10,11,12};*(&a[1][3])的含义(或值...
int a[ ][3]={1,2,3,4,5,6,7,8,9,10,11,12}意思就是一个二维数组,后面的3代表列数,也就是一行有3个数。二维数组行数可以不写,但是一定要写列数。&a[1][3]意思是a【1】【3】的地址,再加上* ,表示该地址所致的变量的数值,也就是};*(&a[1][3])=a【1】【3】。

c语言 int a[]={1,2,3,4,5,6,7,8,9,10},*p=a,则值为3的是
答案A.数组定义是a[0]=1,a[1]=2,a[2]=3, ...,a[9]=10 A. p += 2使p指向a[2], *(p++)表示先取*p的值, 然后p增加1(指向a[3]), 所以取得的值是a[2]=3 B. p += 2使p指向a[2], *++p表示先p增加1(指向a[3]),然后取*p的值,所以是a[3]=4 C. p += 3使p...

C语言问题:从键盘输入两个矩阵,输出两个矩阵的乘积
void main(){ int a[3][4]={{1,2,3,4},{4,5,6,7},{7,8,9,10}};int b[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};int i,j,c[3][3];for(i=0;i<3;i++){ for(j=0;j<3;j++){ c[i][j]=a[i][0]*b[0][j]+a[i][1]*b[1][j]+a[...

c语言在int a[3][3]={{1,3,5},{2,4,6},{7,8,9}};中,数组元素a[1][1...
a[0][0] = 1, a[0][1] = 3, a[1][0] = 2, a[1] [1] = 4

相似回答