
二维数组指针的问题?
己知二维数组a[3][4]a,a[0],*(a+0),*a,&a[0][0]是相等的a,a[0],&a[0][0]相等我都理解但*(a+0),*a又分别代表什么意思..这...
己知二维数组a[3][4] a,a[0],*(a+0),*a,&a[0][0]是相等的
a,a[0],&a[0][0]相等我都理解
但*(a+0),*a又分别代表什么意思..这个应该如何理解.....
*不是取内容的运算符吗...加了*之后不就不再是地址了吗.... 展开
a,a[0],&a[0][0]相等我都理解
但*(a+0),*a又分别代表什么意思..这个应该如何理解.....
*不是取内容的运算符吗...加了*之后不就不再是地址了吗.... 展开
5个回答
展开全部
*(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)。
*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)。
展开全部
首先说明:*(a+0),*a,a[0],&a[0][0]0行0列的元素的地址
a是二维数组名,指向一维数组a[0],即0行的首地址,它与上述四个表示形式值相同,但是意义不同。
然后再说一下二维数组指针的问题:
1.二维数组名a,指向的是一维数组,一维数组指向的是元素值。
所以,移动a,如a+1是指向一维数组a[1],而不是指向0行1列的元素!
2.*运算符在这里可以理解为:向下走一级.
*(a+1),是把a+1向下走一级,即指向元素,而不是指向一维数组,即1行0列的元素,此时它=a[1]。*(a+1)+1,是在元素上移一位,即指向a[1][1]元素。
3.类似的,针对你这道题,*(a+0)就是先在以为数组上移动0个单位,再将之降一级定位到一维数组的元素中,*a则是直接降级到一维元素中。
我自已写的都觉得有点绕~~建议你还是耐心把书多读几遍吧,谁写的都没书上写的详细,这部分本来就绕,慢慢理解了~~
a是二维数组名,指向一维数组a[0],即0行的首地址,它与上述四个表示形式值相同,但是意义不同。
然后再说一下二维数组指针的问题:
1.二维数组名a,指向的是一维数组,一维数组指向的是元素值。
所以,移动a,如a+1是指向一维数组a[1],而不是指向0行1列的元素!
2.*运算符在这里可以理解为:向下走一级.
*(a+1),是把a+1向下走一级,即指向元素,而不是指向一维数组,即1行0列的元素,此时它=a[1]。*(a+1)+1,是在元素上移一位,即指向a[1][1]元素。
3.类似的,针对你这道题,*(a+0)就是先在以为数组上移动0个单位,再将之降一级定位到一维数组的元素中,*a则是直接降级到一维元素中。
我自已写的都觉得有点绕~~建议你还是耐心把书多读几遍吧,谁写的都没书上写的详细,这部分本来就绕,慢慢理解了~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对与某个而未数组 int a[M][N]; 单个的a 代表本数组的第一个元素的地址,或者说是数组基地址;那么a 的类型入楼下所说,是(int *)[N],你可以理解为一个特殊的一维数组,或者行数组,这个特殊数组的每个元素又是一个一维数组,那么“a+0”是一个二维指针,我们要求的数组的首地址,所以其前面就得加*,使其的意义变为一个指向一维数组的指针;*a就和*(a+0)等价了。
不知你明白没?
不知你明白没?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
但它现在是二维数组啊,int a[3][4]时,a的类型并不是int*,而是 (int *)[4],所以*(a+0),*a,还是a[0]这个数组的首地址.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询