C语言:数组指针

一、数组指针本质

数组指针本质是一个指针,该指针存放的是数组的地址。

int nums10 = { 1,2,3,4,5,6,7,8,9,10 };

int(*p)10 = &nums;
二、数组指针类型

int nums10 = { 1,2,3,4,5,6,7,8,9,10 };

int(*p)10 = &nums;

对于数组指针p来说,其指针类型是 int (*) 10

char arr5 = { 'a','b','c','d','e' };

char(*q)5 = &arr;

对于数组指针q来说,其指针类型是 char (*) 5

在定义数组指针时,(*变量名),因为 的优先级比 * 高,如果不用括号,则变量名先与 结合,这样就变成了一个数组,用括号则先与 * 结合,这样才是一个指针。

以 int(*p)10 = &nums 为例,(*p)表明p是一个指针,10表明指针p指向一个元素个数为10的数组,int 表明该数组是int型数组。

char* arr5;

char* (*p1)5 = &arr;

p1是数组指针,指向一个指针数组,该数组存放的是5个char型指针

int nums\[\] = { 1,2,3 };

int(*p2)3 = &nums;

p2是数组指针,指向一个int型数组,该数组存放的是3个int型数据

(注意:定义数组指针时 常量不可省略,即使数组没有表明元素个数,自己数也要数出来,填入常量 )
三、数组指针的用法

数组指针有什么用处?难道仅仅是存放一下数组的地址吗?

cpp 复制代码
int nums[5] = { 1,2,3,4,5 };
int(*p)[5] = &nums;
for(int i = 0; i < 5; i++)
{
    printf("%d ", (*p)[i]);//(*p)相当于数组名nums,(*p)[i]相当于*(*p+i)
}

如果仅仅是这样,那不如直接用普通指针变量来接收数组的地址

cpp 复制代码
int nums[5] = { 1,2,3,4,5 };
int* p = nums;
for (int i = 0; i < 5; i++)
{
	printf("%d ", p[i]);//p[i]相当于*(p+i)
}

显然数组指针的用处绝不是如此使用。

数组指针其实是在当二维数组需要传参时,用于接收二维数组的,因为数组传参时传的都是数组首元素地址,一维数组首元素地址是第一个元素的地址,而二维数组的首元素地址是一第一行的地址,第一行其实就是一个一维数组,因此可以用数组指针接收。

cpp 复制代码
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]相当于*(p+i),p[i][j]相当于*(*(p+i)+j)
		}
		printf("\n");
	}
}


int main()
{
	int nums[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
	Print(nums,3,5);

	return 0;
}

四、小练习:区分下列是指针还是数组

int arr15 是数组,存放的是5个int型数据

int *arr210 是指针数组,存放的是10个指针,每个指针指向的是int型数据

int (*arr3)10 是数组指针,存放的是一个数组的地址,该数组中存放的是10个int型数据

int (*arr410)5 是数组,存放的是10个数组指针,每个数组指针指向一个存放5个int型数据的数组

相关推荐
2601_962295991 小时前
嵌入式开发语言用哪个最好,C,python或者其他
c语言·python·嵌入式开发·开发效率·系统资源
是隼人4 小时前
buuctf-pwn [HarekazeCTF2019]baby_rop2(64位ret2libc)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
wuyk5555 小时前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
AAA代码批发商7 小时前
Days 39 Linux C 开发之 SQLite 数据库完整学习笔记
linux·c语言·数据库
卢锡荣9 小时前
单芯掌控多口互联|乐得瑞 LDR6020 PD3.1 多通道 Type‑C 控制 SOC 芯片
c语言·开发语言
wuminyu9 小时前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++
susplus9 小时前
【HTTP协议】HTTP介绍及基础【C语言爬虫实现】
c语言·爬虫·http·万维网
xx~t10 小时前
嵌入式——Linux软件编程——数据库
linux·c语言·数据库·oracle·sqlite
水饺编程10 小时前
第5章,[Win32 章节] :圆角矩形教学插图绘制程序
c语言·c++·windows·visual studio
是隼人10 小时前
buuctf-pwn PWN4(双引号的转义缺陷)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门