数组指针的定义与使用

数组指针存放数组的地址由于数组的大小和类型各有不同,所以数组指针的定义与赋值应该与具体的数组绑定。

一维数组指针定义的三种方法

一维数组指针保存一维数组的地址,是一个二级指针

1、定义一个数组,再定义一个相应的数组指针,最后将数组的地址赋值给数组指针

int a[10] = {0};
int (*p)[10];
p = &a;

2、先给数组类型取别名,用别名来定已定义数组与数组指针,最后完成赋值(不常用)

typedef int ARR[10];  // ARR 的类型为int [10],代表存放10个int类型的数组
ARR b = {0};
ARR *p = &b;

3、直接给数组指针类型取别名,用别名定义数组指针类型,最后完成赋值

typedef int (*PARR)[10];	// PARR的类型为int(*)[10],代表一个指针类型
							// 这个指针类型存放int [10]类型数组的地址
int a[10] = {0};
PARR p = &a;

二维数组指针定义的三种方法

二维数组指针保存二维数组的地址,是一个三级指针,定义方法同一维数组指针的定义

//  1、直接定义后赋值
int a[2][3] = {0};
int (*p)[2][3] = &a;
//	2、给二维数组类型取别名后再定义赋值
int a[2][3] = {0};
typedef int ARR[2][3];
ARR b = &a;
//	3、给二维数组指针类型取别名后再定义赋值
int a[2][3] = {0};
typedef int (*PARR)[2][3];
PARR p = &a;

二维数组的地址表示以及步长

数组指针的定义与使用_第1张图片

二维数组指针的使用(用二维数组指针遍历一个二维数组)

int main06x()
{
	int   a[2][3] = { 1,2,3,4,5,6 };
	int(*p)[2][3] = &a;

	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		for (int j = 0; j < sizeof(a[0]) / sizeof(a[0][0]); j++)
		{
			// *p 代表第0行的地址,*p + i 代表第i行的地址,是一个二级指针
			// *((*p) + i)代表第i行第0列的地址,对行地址取*表示对应行第0列的地址
			// (*((*p)+i)+j)表示第i行第j列的地址
			// *(*((*p)+i)+j))表示第i行第j列的值
			printf("%d ",*(*((*p)+i)+j));
			printf("%d ", (*p)[i][j]);// *p ==A  *(*(A+i)+j)  *(A[i]+j) == A[i][j] (*p)[i][j]
		}
	}

	system("pause");
	return 0;
}

使用二维数组指针操作二维数组有点复杂,一般对二维数组的操作使用一维数组指针,即行指针

int main07()
{

	int a[2][3] = { 1,2,3,4,5,6 };
	//定义一个指针来保存 二维数组的首行地址  &a[0] ==  a
	//因为要保存第0行的地址,第0行其实就是一个一维数组,即保存一维数组的地址,一维数组
	int(*p)[3] = a;
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		for (int j = 0; j < sizeof(a[0]) / sizeof(a[0][0]);j++)
		{
			//printf("%d ",*(*(p+i)+j));//*(p[i]+j) == p[i][j]  *() == []
			printf("%d ",p[i][j]);
			printf("%d ", a[i][j]);
		}
	}
	system("pause");
	return 0;
}

你可能感兴趣的:(指针)