关于C的指针问题,请高手指点~

来源:百度知道 编辑:UC知道 时间:2024/06/07 05:06:27
为什么我用一个三级指针无法把一个三维数组的元素取出??特别是当我把三维数组的数组名赋值给三级指针变量时,系统会提示:不能转换指针,用强制类型转换是可以,地址值也不变(经测试,该指针变量地址值与该三维数组中的对应元素的地址值一样),但就就是输出的数并不是对应的三维数组中的元素.这是为什么呢?请指点.
这个问题在我认为,我觉得这是因为,指针的N级与数组的N级是不同的概念,准确来说应该是他们引起系统的操作不同.例如: int *a; 4int *b;int *c; int z=3; c=&z; b=c;a=b; 则****a==3.这与int ****a;a=&z;这个四级指针一样.都是通过”中介”/”间接”的方式访问元素. 而假若是四维指针: int z[a][b][c][d]{.......};/*a,b,c,d均为常量*/
*(*(*(*(z+a-1)+b-1)+c-1)+d-1)引起的指针操作是z+ (a-1)*d*c*b + (b-1)*d*c + (c-1)*d + (d-1),即它所引起的操作是对指针的运算,而非逐层访问.所以即使是同等级指针与数组名,也不能通过N级指针的访问操作去访问数组元素......这是我的想法...不知道你如何看?请指点!

不管几维数组,用一级指针就行了。
一级指针是一个指向内存的位置的,二级指针就是一个指向一级指针的指针。三级,四级的以此类推。
对于多给数组,在内存里都是线性存在的。直接通过首指针的偏移寻址就能找到里面的任何一个元素,根本不用那么多级的指针。

特别是当我把三维数组的数组名赋值给三级指针变量时,系统会提示:不能转换指针,用强制类型转换是可以
这个的原因就是,他本来就是一级的指针的,你赋给三级的当然会出警告了。

比如 int a[3][3] = {1,2,3,4,5,6,7,8,9};
想取到9,用指针可以这么取:int *b = a; int c = *(b+8);//此时c=9
也可以这么取int *b = a; int c = b[8];
其他的多维数组也是一个道理。

定义一个三维数组,如int a[1][2][3],那么a就是一个三维指针,没必要你说的这么复杂。

假如定义一个a[2][2][2],*p;
且p=a;
假设a中的元素是:
000=***p
001=***p+1
010=**(*p+1)
011=**(*p+1)+1
000=***(p+1)
101=***(p+1)+1
110=**(*(p+1)+1)
111=**(*(p+1)+1)+1
其实都是他们降维使用,也是a[2[2[2]分成两个a[2[2],再分成两个a[2]
所以p+i是页的地址 *(p+i)+i是行的地址 *(*(p+i)+i)+i是元素地址