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所在位置的内容。