二维数组名和指针的关系
发布网友
发布时间:2022-06-28 04:21
我来回答
共4个回答
热心网友
时间:2023-10-06 04:32
应该这样写
int a[10][10];
int (*p)[10]=a;
p是行指针,一行有10个元素
热心网友
时间:2023-10-06 04:32
int a[10]; int *p=a代表将a数组的地址传给指针p,而a[10][10]的a既不代表一行的地址也不能代表整个二维数组的地址,所以无法传给**p啊
热心网友
时间:2023-10-06 04:33
http://zhidao.baidu.com/link?url=vT2-_gYAxZd9-GI2ptEXOJ402Ndc99L4DRohoh7WMnNG7aWdG_XePN509ry31fIBDz5H_SntMpe4NU9FQpQ3Za
百度知道上已经有类似的问题了
热心网友
时间:2023-10-06 04:33
二维数组名即数组地址,指向首行地址,表面上看,行地址即一维数组指针,而数组名指向行就应该是指针的指针,但是必须注意指针也是有类型的,类型不同数据宽度也不同。
如果a[10][10],假设int **p=a; 那么要对行递增执行p++时,编译器如何知道列宽?因为int **是指指向一个 int *类型的指针,32位系统中int *的宽度为4字节,即地址宽度是4字节,因此p将指向下一个元素(整数指针),也就是p递增了4字节,而不是10个int型数据的宽度,这就错位了。
所以a[10][10]的地址类型不是简单的指针的指针,而是行指针的指针,而行宽是由你定义的数组列数和元素类型所决定,int类型就是4*10=40个字节。这叫数据对齐。因此编译器在转换数组名时,会根据对齐要求而确定相应的指针类型,所以a的地址类型应该是int (*)[10],而不是int **。
所以应该这样:int (*p)[10]=a;
其含义为,p是一个指向(含10个int类型元素的一维数组或行的)指针,其实本质上任何指针都是4字节(32位系统),你完全可以将一种指针类型强制转为任何其他类型,那为什么还要区分指针类型,就是为了指针运算时实现数据对齐,准确定位。