Pro*_*mer 19 c arrays jagged-arrays multidimensional-array ansi-c
关于C编程语言(ANSI-C)的一个简单问题:
C中的多维数组是锯齿状的吗?
我的意思是 - 我们在谈论"数组数组"(一个指向内存中其他地址的指针数组),或者这只是"长一维数组"(它是按顺序存储在内存中)?
困扰我的是我有点确定:
matrix[i][j] 相当于 * (  *  (matrix + i) + j)
use*_*ica 13
C中的多维数组是连续的.下列:
int m[4][5];
由int[5]记忆中彼此相邻的4 秒组成.
指针数组:
int *m[4];
是锯齿状的.每个指针都可以指向不同长度的单独数组(的第一个元素).
m[i][j]相当于*(*(m+i)+j).参见C11标准,第6.5.2.1节:
下标运算符[]的定义是E1 [E2]与(*((E1)+(E2))相同)
因此,m[i][j]相当于(*(m+i))[j],相当于*(*(m+i)+j).
存在这种等价是因为在大多数情况下,数组类型的表达式衰减到指向其第一个元素的指针(C11标准,6.3.2.1).m[i][j]解释如下:
m是一个数组数组,因此它衰减到m[0]第一个子数组的指针.m+i是指向ith子阵列的指针m.m[i]相当于*(m+i),取消引用指向该i子数组的指针m.由于这是数组类型的表达式,因此它会衰减为指针m[i][0].m[i][j]相当于*(*(m+i)+j),取消引用指向j该i子数组的第th 个元素的指针m.请注意,指向数组的指针与指向其第一个元素的指针不同.m+i是一个指向数组的指针; 它不是数组类型的表达式,它不会衰减,无论是指向指针还是指向任何其他类型.
如果声明一个多维数组,您将得到“长一维数组”(在内存中顺序存储)。
如果你声明一个指向指针的指针(指向指针......),你会得到数组的数组。
对于 C 初学者来说,这种差异是很多困惑的根源。
| 归档时间: | 
 | 
| 查看次数: | 2126 次 | 
| 最近记录: |