c语言二维数组的下标运算与指针偏移
扫描二维码
随时随地手机看文章
首先,定义一个二维数组int Array[y][x];
一、 对于二维数组的指针偏移的运算法则。同一维数组一样,二维数组的数组名也是指向第一个数组元素的(即Array等于&Array[0][0]),且二维数组的数组元素在计算机内的内存存放也是连续的,但不一样的是:Array+1的值不是&Array[0][1],而是&Array[1][0](即,对于二维数组Array[][x],指针Array+1中的1表示的字节数是sizeof(int)*x,而不是sizeof(int),若要表示Array[i][l]的地址,应该是 *(Array+i)+l,要复引用a[i][l],则应该是*(*(Array+i)+l)。
但是注意,同一、二维数组名一样,虽然Array+1的值等于第二行第一个元素的地址,但是使用指针运算符引用 *(Array+1)得到值依然只是一个地址。
二、指向二维数组的指针。
如果建立一个这样的指针 int *ptr=Array ,则对ptr的指针和下标运算和指向一维数组一样。对于Array这个二行三列的二维数组来说,ptr[i*x+l]表示的是第i行第l列的元素,因为二维数组的元素在内存中实际上也是线性存放的,所以ptr[i*x+l]访问到的第i*x+l个元素就是第i行第l列的元素(虽然编译器会报错)。另外对于这个指针不能采用ptr[i][l]的双下标运算,即使它指向一个二维数组。
如果建立一个这样的指针 int(*ptr)[3]=Array (表示建立一个指向有三列的二维数组的指针),则可以采用双下标运算ptr[i][l],或者*(*(ptr+i)+l),这都等效于Array[i][l]。