探究二维数组的传递

<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;
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值