C语言指针数组和数组指针

1. 指针数组

1.1 概念

指针数组本质上是一个数组,是存放指针的数组。

1.2 指针数组表示

以整型指针数组和字符指针数组为例

int *arr1[3];//数组arr1有5个元素,每个元素的数据类型是整型指针数组
char *arr2[5];//数组arr2有5个元素,每个元素的数据类型是整型指针数组

1.3 举例

利用指针数组将多个一维数组模拟为一个二维数组:
假设有三个整型数组

int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };

将arr1、arr2、arr3的首元素地址存放在数组parr中,该数组就是整型指针数组

int* parr[3] = { arr1,arr2,arr3 };


图1 指针数组图例

但是需要注意的是:arr1、arr2、arr3这三个数组在内存中不一定会连续存放

访问数组元素并打印

for (i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			//printf("%d ", *(parr[i] + j));
			printf("%d ", parr[i][j]);
		}
		printf("\n");
	}

2. 数组指针

2.1 概念

顾名思义,数组指针本质上是指针,是指向数组的指针

2.2 数组名

数组名通常表示的都是数组首元素的地址,但是有2个例外:
(1) sizeof (数组名) , 这里的数组名表示整个数组,计算的是整个数组的大小;
(2)&数组名,这里的数组名表示的依然是整个数组,所以&数组名取出的是整个数组的地址。
假设有一个10个整型元素的数组arr:
在这里插入图片描述
图2 &arr 和 &arr + 1图例

2.3 数组指针表示

以图2的数组为例,&arr是一个地址,那么应该存到哪里?
这里引入数组指针,可将这个数组地址存放在指针p中,p就是数组指针

int (*p)[10];//指针变量p,指向的是一个包含10个整型元素的数组

p先和*结合,说明p是一个指针变量,指向的一个包含10个整型元素的数组,需要注意的是,[]的优先级高于,所以加上()保证p先和*结合。
这里可以说明一下p的类型是int (*)[10],表示数组指针类型。

2.4 举例

用数组指针表示二维数组
在这里插入图片描述
图3 二维数组图例

void print(int(*p)[5], int r, int c)//这里用一个数组指针接收
{
	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			printf("%d ", *(*(p + i) + j));
			//*(p+i)表示第i行的数组名,相当于arr[i],即第i行首元素地址
			//*(p + i) + j表示第i行首元素地址加j操作,即第i行第j个元素的地址
		}
		printf("\n");
	}
}
int main()
{
	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
	//数组名表示首元素地址,二维数组的数组名表示第一行数组的地址
	print(arr, 3, 5);//arr表示第一行数组地址,也就是一个一维数组的地址
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值