欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数组指针的定义与使用

程序员文章站 2024-02-26 18:49:46
...

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

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

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

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;

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

数组指针的定义与使用

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

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;
}
相关标签: 指针