为什么不能把二维数组名/行的首地址赋给指针?
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;
数组指针与普通指针有什么不同吗? 展开
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;
数组指针与普通指针有什么不同吗? 展开
4个回答
展开全部
要想直接把一个二维数组名赋给一个指针,这个指针必须是行指针或二级指针才可以;
因为在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)。
因为在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)。
展开全部
指针和指针不一样,是有类型的,类型不同不能赋值。。。虽然指针本质上都是一个地址值,但还是不允许不同类型指针相互赋值,主要是为了防止滥用指针,导致出错也不好察觉,但还是有赋值方法,那就是可以强制转换。。。。
b并不是int *型的指针,所以不能赋值给p。。。。 指针类型不同最大的区别就是运算时偏移的地址不同。。。同样是 b+1 ; 假设b=1000 ,是char 型, b+1的值为1001,int为 1004,long是
1008, int (*b)[3], 就是1012;
b并不是int *型的指针,所以不能赋值给p。。。。 指针类型不同最大的区别就是运算时偏移的地址不同。。。同样是 b+1 ; 假设b=1000 ,是char 型, b+1的值为1001,int为 1004,long是
1008, int (*b)[3], 就是1012;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指针变量是被某种变量类型派生出来的。
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指针》看看。
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*。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询