C语言 数组问题~

来源:百度知道 编辑:UC知道 时间:2024/06/16 19:00:55
如果有个 二维数组
例如 a[2][5];和a[10]有什么区别
我今天写了个程序出错,
我记得我学刚学C时,不是说数组时连续储存的。难道,a[2][5],a[10]
首地址不同,我记得汇编讲到数组,也是在连续空间存储的,数组段基值加上偏移地址,然后加上地址偏移量。

a[2][5]是二维数组,而a[10]是一个一维数组

分配的首地址肯定是不同的

数组的确是连续存储的。
a[2][5]是二维数组,a[10]是一位数组。如果在一个函数中同时定义这两个数组,会编译错误。如果你是分别在两次运行中,定义a[2][5]和a[10],首地址不同是完全有可能的,因为内存地址由系统随机分配,程序不能决定这个。

虽然在内存里是连续存储的,但可将二维数组看做一个矩阵,那个a[0]就是指矩阵第一行的首地址,a[1]为矩阵第二行的首地址,以此类推。对二维数组来说,这个a[10]并不是数组的元素,而是第11行的首地址。a[10][0]才是第11行的第1个元素。a[2][5]是第三行第六个元素,而a[10]是一个地址,指向第11行首位。
另外,C里数组下标是从0开始的,a[2][5]的偏移里是2*列元素个数+6,肯定不会是10。
可以将二维数组的首地址赋给一个指针变量。假设是*p,那么*(p+n)代表第n+1个元素。
明白了吧?

你讲得都没有错,但在C语言中,a[2][5]和a[10]是有区别的
a[2][5]中,a是二级指针,a+1不指向a[0][1],而指向a[1],a[1]也是指针,
a[10]中,a是一级指针,a+1指向a[1]