二维数组的若干问题

这篇博客详细探讨了二维数组的创建、指针指向以及在函数参数和引用中的使用。通过实例展示了如何在栈和堆上创建二维数组,以及如何用指针访问数组元素。此外,还讨论了在C语言中二维数组作为函数参数的处理方式,并指出C++不支持数组的直接引用。

二维数组与指针

1、如何建立二维数组?

栈:

int a[M][N] = {0};

堆:

new int[M][N];
malloc(M * N * sizeof(int));

2、如何用指针指向二维数组?

假设已定义一个整型二维数组:

int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}};


虽然a[0]、a都是数组首地址,但二者指向的对象不同:①a[0]是一维数组的名字,它指向的是a[0]数组的首元素a[0][0],对其进行"*"运算(*a[0])得到的是一个数组元素值a[0][0]。可以用*(a[i]+j)表示该二维数组第i行、第j列的元素a[i][j]。②a是二维数组的名字,它指向的是它所属元素的首元素,它的每一个元素都是一个行数组,因此,它的移动单位是行,所以a+i指向的是第i个行数组,即指向a[i]。对a进行"*"运算,得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值可以用*(*(a+i)+j)表示该二维数组第i行、第j列的元素a[i][j],当i=0,j=0时,**a即为a[0][0]。

如何用一个指针p指向该二维数组呢?有int(*p)[N]、int* p、int** p三种方式。

int(*p)[N] =a;//如果是动态申请的数组,则为int(*p)[N] = new int[M][N];这里的p与a[M][N]中的a等价
int* p = a[0];//如果是动态申请的数组,则为int* p = *(new int[M][N]);或者int* p = (int*)(new int[M][N]);
int** p = (int**)a;//如果是动态申请的数组,则为int* p = (int**)(new int[M][N]);


3、如何引用二维数组元素?

①如果采用int(*p)[N] = new int[M][N];可以用以下方式引用数组元素:
p[i][j]
*(p[i]+j)
*(*(p+i)+j)
②如果采用int* p = *(new int[M][N]);可以用以下方式引用数组元素:
*(p+i*N+j)
③如果采用int** p = (int**)(new int[M][N]);可以用以下方式引用数组元素:
*(p+i*N+j)

二维数组与函数参数

1、二维数组如何做形参?

C语言中没有引用,可以用如下三种方式:

void func(int a[M][N]);//a为二维数组首行元素的地址
void func(int a[][N]);//a为二维数组首行元素的地址
void func(int (*p)[N]);//p为指向二维数组首行元素的指针


说明:

①一维数组做形参为void func(int a[]),不用指定数组大小,因为这里形参虽然是数组形式,但编译时是将a按指针变量处理的,相当于void func(int *a)。在函数被调用时,系统会建立一个指针变量a,用来存放从主调函数传递过来的实参数组首元素的地址。

②同理,二维数组做形参时,void func(int a[][N]),在函数被调用时,系统会建立一个指针变量a,用来存放从主调函数传递过来的实参二维数组首行元素(含N个元素)的地址。

③数组名作形参时,传递的是指针,因此对数组元素的操作会改变实参的值。

二维数组与引用

1、C++中是否能建立数组的引用?

int& a[M];//错误,不能建立元素类型为引用的数组



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值