数组指针和指针数组

首先,我们先理清一下一些概念:

数组名字是数组首元素的地址

在我的理解里面

如一个数组arr[5]      有*(arr+i) ==arr[i]

那么我们现在可以开始讨论数组指针和指针数组了。

指针数组

指针数组顾名思义就是存放指针的数组,我们可以通过以下代码来理解他

int main()
{
	int a = 1, b = 2, c = 3;
	//现在我们先创建一个指针数组
	int* p[10] = { &a,&b,&c };
	//如何理解呢
	//p首先和[]结合,表示是一个数组,int*表示数组内每个元素是int*类型的
	//(变量名字去掉就代表是这个变量的类型)
	*p[0] = 2;
	printf("%d", a);

		
}
因为数组里面存放的是指针,我们对数组里面的元素解引用,就把a的值给改变了

数组指针

顾名思义,数组指针是数组的指针,我们同样可以通过以下代码来理解他

void My_Printf(int (* arr)[5])
{
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%d  ", (*(arr+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} };
	My_Printf(arr);
	return 0;
}

这是一个有关二维数组传参的问题,我们的目的是为了去打印这个二维数组里面的内容

依我看来,二维数组的本质其实是一维数组的数组

就比如说上述的arr数组,其实是arr[0] arr[1] arr[2]这三个数组组成的数组

注意

在数组传参的时候,我们传的是arr,arr是什么呢,arr其实是这个二维数组的首元素的地址,那啥是这个二维数组首元素的地址呢,就是arr[0]   这一个数组

因此我们在形参部分,要用  数组指针来接受这个值

这时候可能就有人不知道数组指针写出来的形式是怎么样的了,我们同样通过以下代码来理解

int main()
{
	int(*p)[10];
	//这个就是数组指针的形式,我们一个一个部分来理解他
	//* p代表的是p是一个指针变量,我们把变量除去,剩下的就只有int(*)[10]就是数组指针类型,
}

当然,这是一个不完整的代码,如果要强行运用这个数组指针其实是很难用的,可以结合上述二维数组传参来理解。

那么,我们继续来讨论这个代码

void My_Printf(int (* arr)[5])
{
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%d  ", (*(arr+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} };
	My_Printf(arr);
	return 0;
}

我们用int(*arr)[5]这个数组指针去接收arr (即arr[0])后,两个循环打印行和列不必多说

重点在于这一行

printf("%d  ", (*(arr+i))[j]);

怎么理解呢

开头我们讲到,*(arr+i) == arr[i]

arr是什么,是数组指针,我们用一张图来看出这个数组的特点

一开始arr作为数组指针指向的是上图数组的一开始,因为arr+1则是直接跳过5个int类型的值,就是20个字节来到arr[1]前面

我们对(arr+i)解引用(*(arr+i))就是 第i+1个一维数组的首元素的地址

那么我们再通过对这个一维数组首元素进行+j操作就可以访问这个数组的值、

printf("%d  ", *(*(arr + i) + j));

其实这个东西就等价于arr[i][j]

加上换行符,我们就可以打印这个二维数组的值了

数组指针数组

开始套娃,数组指针数组就是(数组的指针)的数组,本质上是指针数组

int main()
{
	int a[3] = { 0,1,2 };
	int b[3] = { 1,2,3 };
	int(*pa)[3] = &a;
	int(*pb)[3] = &b;
	int* p[2] = { pa ,pb };

}

指针数组指针

指向数组的指针的指针,其实是一个二维指针

int main()
{
	int a = 10, b = 20, c = 30;
	int* arr[3] = { &a,&b,&c };
	int** p = arr;
	printf("%d\t", *(*(arr + 1)));//等价于*arr[1]
	printf("%d\t", **p);//相当于第一个元素arr[0]解引用

}

数组指针数组指针数组指针数组指针数组指针数组指针数组指针数组指针数组指针数组指针数组指针数组指针数组指针数组指针数组指针......

这个无限套娃的问题让我想到了一张图wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==文章的最后,附上一道题目吧

这个代码的运行结果是哪个呢?(答案是2,3)

注意:本文章只是一个新手学习中写出来的,不太具有学习和参考价值,其实就是写给自己看的

如果有误,请大佬们纠正!谢谢大家

相关资料参考:b站比特鹏哥c语言视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值