探究二维数组的传递

来源:互联网 发布:手机短信平台软件 编辑:程序博客网 时间:2024/05/16 07:34
<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;}


                                             
0 0
原创粉丝点击