如何理解二维数组名

如何理解二维数组名

C语言中数组名可以在传引用时自动转换为指针

例如

int l[2][3]

void myPrint(int** ary){

//可以转换为 int(*)[3]类型进行行列

//也可以直接 int** 操作

}

myPrint(l)

如何高效率的引用在myPrint中的ary呢

从一个例子入手

#include

int main(){

int A[3][3]={{1,2,3},{4,5,6},{7,8,9}};

// 函数中传递 A 的类型 int(*)[3]

printf("%d",*(*(A+1)+3));

return 0;

}

上述例子中的数组名A被编译器解释为 int(*)[3],

上面的例子输出结果为 7 为什么是7呢

1. 首先 A+1,编译器解释为 int(*)[3]+1 这是一个指针加 1个整数,

相当于 数组首地址偏移了 size(int[3])字节数,

很明显这是对应A数组的第二行的首地址

2. *(A+1)+3 编译器解释为 第二行的首地址(也是首列) 偏移了 3+sizeof(*(A+1)) = 3*sizeof(int*) = **偏移了4个元素**

3. 那么从第2行第0列往后偏移4个元素的位置 就是7所在的位置

4. *(*(A+1)+3) 取7所在位置的内容。

相关推荐