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

被折叠的 条评论
为什么被折叠?



