<span style="font-family: Arial, Helvetica, sans-serif;"><pre name="code" class="cpp"></span>
#include <stdio.h>
const int MAXN = 3;
int arr[MAXN][MAXN];
void func1(int ptr[MAXN][MAXN],int N){ // 可行(常用)
// 或 (*ptr)[MAXN] 或 ptr[][MAXN] ;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
printf("%d ",ptr[i][j] );
}
printf("\n");
}
}
void func2(int *ptr, int N){ // 可行 ( 指针降级 )
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
printf("%d ",(ptr+i*N)[j] );
}
printf("\n");
}
}
void func3(int **ptr, int N){ // 不可行 (访问越界)
/* 为什么 int (*ptr1)[MAXN] 可用而 int **ptr2 不可用 :
ptr1, ptr2都指向原数组arr的首地址 , 如 0x407020
但是 ptr2指向的东西, 也就是 int *, 是一个指针类型的变量, 是一个变量
那么 *ptr2( 同ptr2[0] )就相当于取出 ptr2指向的那块内存(0x407020)所存的变量的值 ,
也就是 0x407020处即a[0][0]的数据值(假设a[0][0]=4).
那么ptr2[0][1] 就是把地址为 0x4 的一段连续内存当做数组(实际上不是数组),
取这个数组的[1], 也就是第二个元素 (地址为0x8), 造成内存访问越界
而 ptr1指向的类型的 int [MAXN] , 是一个int型的数组而不是一个变量
那么 *ptr1( 同ptr1[0] )就是取出 ptr1指向的那块内存(0x407020)所存的数组(数组不是一种类型),
是一段连续的内存 , 那么 ptr1[0][1]自然就是 取出以的 (0x407020) 为首地址的
数组中的第二个元素 , 正常访问
*/
printf("%d",*(ptr+1));
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
printf("%d ",(ptr+i*N)[j] );
}
printf("\n");
}
}
int main(){
for(int i=0; i<MAXN; i++){
for(int j=0; j<MAXN; j++){
arr[i][j] = i+j;
}
}
func1(arr,MAXN);
func2((int*)arr,MAXN);
func3((int**)arr,MAXN);
return 0;
}