二维数组的若干问题

来源:互联网 发布:vr图片软件 编辑:程序博客网 时间:2024/05/17 04:14

二维数组与指针

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];//错误,不能建立元素类型为引用的数组



0 0
原创粉丝点击