为什么不能把二维数组名/行的首地址赋给指针?

inta[3]={1,2,3};int*k=a;//可以通过int*j=a+1;//可以通过intb[][3]={{1,2,3},{4,5,6}};int*p=b;//不... int a[3]={1,2,3};
int *k=a; //可以通过
int *j=a+1; //可以通过

int b[][3]={{1,2,3},{4,5,6}};
int *p=b; //不可通过
int *o=b+0 //不可通过
int *u=b+1 //不可通过
int *i=*b; //可以通过
int *y=*(b+0); //可以通过
int *t=*(b+1); //可以通过

二维数组一定要x行0列元素地址才能赋值给指针?该行的首地址却不行?地址不是一样的吗?
我看书是0行0列地址和二维数组名/0行首地址的地址一致。
还有为什么二维数组名可以赋给数组指针?
int (*p)[3]=score;
数组指针与普通指针有什么不同吗?
展开
 我来答
赤水云
2015-11-15 · TA获得超过5029个赞
知道大有可为答主
回答量:2362
采纳率:86%
帮助的人:907万
展开全部
要想直接把一个二维数组名赋给一个指针,这个指针必须是行指针或二级指针才可以;
因为在C编程系统中,对于二维数组会看成数组元素为一维数组的一维数组,即对于二维数组aa[2][3],系统会看成aa[0]和aa[1],而aa[0]和aa[1]中分别包含三个元素,这就是系统对于二维数组的处理;
所以直接把二维数组名赋给一个普通的指针变量,这个指针是指向元素aa[0]的,但实际上呢,aa[0]不是一个具体的元素,而是元素aa[0][0]的地址;
所以只有把数组名赋给二级指针它才指向一个具体的元素。
二维数组名不能说是二级指针,不能按指针的思路来理解二维数组,要按一维数组的思路来理解,即按照系统的理解方式会简单些。

*(a+0)==>a[0]是第一个一维数组的数组名和首地址
*a==>*(a+0)==>a[0]是第一个一维数组的数组名和首地址

int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}
设数组a的首地址为1000。

从二维数组的角度来看,a是二维数组名,a代表整个二维数组的首地址,也是二维数组0行的首地址a+1代表第一行的首地址。

a[0]是第一个一维数组的数组名和首地址,因此也为1000。*(a+0)或*a是与a[0]等效的, 它表示一维数组a[0]0 号元素的首地址,也为1000。&a[0][0]是二维数组a的0行0列元素首地址,同样是1000。因此,a,a[0],*(a+0),*a,&a[0][0]是相等的。
同理,a+1是二维数组1行的首地址,等于1008。a[1]是第二个一维数组的数组名和首地址,因此也为1008。&a[1][0]是二维数组a的1行0列元素地址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。
由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。
此外,&a[i]和a[i]也是等同的。因为在二维数组中不能把&a[i]理解为元素a[i]的地址,不存在元素a[i]。C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,我们得出:a[i],&a[i],*(a+i)和a+i也都是等同的。
另外,a[0]也可以看成是a[0]+0,是一维数组a[0]的0号元素的首地址,而a[0]+1则是a[0]的1号元素首地址,由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j]。

由a[i]=*(a+i)得a[i]+j=*(a+i)+j。由于*(a+i)+j是二维数组a的i行j列元素的首地址,所以,该元素的值等于*(*(a+i)+j)。
TLast_Ghost
2014-05-08 · TA获得超过1542个赞
知道小有建树答主
回答量:649
采纳率:20%
帮助的人:514万
展开全部
指针和指针不一样,是有类型的,类型不同不能赋值。。。虽然指针本质上都是一个地址值,但还是不允许不同类型指针相互赋值,主要是为了防止滥用指针,导致出错也不好察觉,但还是有赋值方法,那就是可以强制转换。。。。
b并不是int *型的指针,所以不能赋值给p。。。。 指针类型不同最大的区别就是运算时偏移的地址不同。。。同样是 b+1 ; 假设b=1000 ,是char 型, b+1的值为1001,int为 1004,long是
1008, int (*b)[3], 就是1012;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
殴零PK
2014-05-08 · TA获得超过128个赞
知道小有建树答主
回答量:157
采纳率:0%
帮助的人:92.7万
展开全部
指针变量是被某种变量类型派生出来的。
b是int (*)[3],
p是int*,
*b是int*,
b,&b[0]和&b[0][0]地址是同样的值,但意思不一样。
b,&b[0]是nt (*)[3],&b[0][0]是int*
你把b+1, &b[0]+1,&b[0][0]+1打出来看看,想想。

如果你想只是放一个地址的话,你应该用void *。
void *p=b;

当然你把b强制转换成int *
int *p = (int *) b;
都是能通过的。

但是没有类型那么同样的一个地址,*b应该是什么?
你如果用void *p=b;那么在后面使用直接使用*p的时候会报错。
因为编译器不知道p的类型,不知道怎么解释p中的值。
希望你看了这些能明白,不明白的话建议你去买本《完全征服C指针》看看。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-05-08
展开全部
int *p=b;                                    //不可通过
int *o=b+0                                 //不可通过
int *u=b+1                                 //不可通过

b是二维数组,即使退化也是int**


int *i=*b;                                    //可以通过
int *y=*(b+0);                            //可以通过
int *t=*(b+1);                             //可以通过

这里的*b、*(b+0)、*(b+1)相当于b[0]、b[0]、b[1]类型是int*。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式