指针数组和数组指针的认识

目录

指针数组

数组指针

回顾


指针数组

本质是个数组,数组内的都是指针。

用指针数组模拟实现二维数组:

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	int* arr[3] = {&a,&b,&c};			//z这就是一个指针数组。int代表它数组内的指针是int型的
	//有一种用法
	int i;
	for (i = 0; i < 3; i++)
		printf("%d ", *arr[i]);
	printf("\n");
	//但是这样是比较低效率的,基本没啥用,接下来用它来模拟二维数组,这样能显示更多的数据。
	int d[] = { 1,2,3,4,5 };
	int e[] = { 2,3,4,5,6 };
	int f[] = { 3,4,5,6,7 };
	arr[0] = d;
	arr[1] = e;
	arr[2] = f;
	int j;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
			printf("%d ", *(arr[i] + j));
		printf("\n");
	}
	//这个是比较直接的,但当我们熟知了[] 的使用方法后就可以这样
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
			printf("%d ", arr[i][j]);
		printf("\n");
	}
}

运行结果:


数组指针

本质是指针,指针指向的是一个数组。

 这是就要重新回顾arr于&arr的差别。

 用代码来解释下

 乍一看结果是一样的,结果一样的原因是首元素地址的和整个元素地址是相同的,但是它们两个意义却不一样。

这一次的结果会是什么呢?

 

 

 一个加4,一个加了40。已知arr是int类型,有十个元素,占40个字节。可以很好得出,它们一个指首元素,一个指整个数组。至于为什么两次首地址不同,问这个就没救了。

讲这么多,就是为了现在铺垫。

 是在arr确定指向的数组时,一定要加&;

但是有时候编译器会对你的代码进行处理,像vs2019,就不会报错且正常处理,但是devc++就不行了,上图。

 

为了写出能够让大多数编译器都能运行的代码,强烈建议还是按照标准,写&a

 

 它的解引用:

先对arr解引用获取a首元素a[0]的地址,在加i后就代表了各元素的地址。

我们会想到二维数组:

二维数组的数组名是首元素的地址,首元素表示:第一行数组。

所以当我们在函数调用时不想因为用太多内存时,就可以用现在的数组指针传参。

比如我要通过传参来实现输出二维数组数组

看图:

 在arr还没解引用的时候我们加i,代表的是第几行,经过print函数,我们成功实现了输出a数组的目标。


回顾

他们分别代表什么?

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昨今非是

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值