C语言中的数组指针和指针数组的区别,代码+图例详解

数组指针和指针数组的区别详解

一、指针数组

格式:int *p [4];
作用:用来存放地址,意思就是这个数组里面的4个内存空间放的都一些数值地址,这些地址是指向一些定义过的数值。
图例
在这里插入图片描述

代码示例

	int arr[4] ;
	int a = 10;
	int b = 15;
	int c = 34;
	int d = 24;
	int *p[4] = {&a, &b, &c, &d};
	printf("%d\n", **p);//输出10

注意点:

  • 为什么是**p呢?因为*p解一层时拿到的是a的地址,也就是0x7ffcc9fd4a21,要想拿到10这个数值还得解一层,也就是**p了。
  • *p 这里的默认拿的是数组的首地址,相当于数组中的arr[0];当然指针是没有p[0]这种写法的。
取值问题:

代码示例:

	int a = 10;
	int b = 15;
	int c = 34;
	int d = 24;
	int *p[4] = {&a, &b, &c, &d};
	printf("%d\n", **p);		//输出10
	printf("%d\n", **p+1);		//输出11
	printf("%d\n", *(*p+1));	//输出15
	printf("%d\n", *(*p+2));	//输出34
	printf("%d\n", *(*p+3));	//输出24
  • 通过输出结果我们可以看出,可以通过*(*p+数组下标)来拿到数组中的其他值,因为数组下标都是从0开始。比如:&b它在数组中位置是1,故可通过*(*p+1)拿到,其他值也一样。
  • 而为什么是通过通过(*p+数组下标)来拿值呢?我们可以这样理解:*P我们前面说过是拿到数值的地址(0xf…),*p+1是不是指针指向了下一个地址,*p+2是不是指针指向了C地址。而在外面再加个*(*p+数组下标)来解一层,是不是通过地址拿到了数值。
  • 还有一个问题,细心的小伙伴是不是已经发现printf("%d\n", **p+1); //输出11
    这行代码的不同了,定义的a,b,c,d也没有11这个数啊,那它哪来的呢?它是a+1得来的。我们一层一层解析它,首先*p(前面说过无指定默认是0地址简写,类似数组arr=arr[0])拿到a的地址,再解一层**p,是不是拿到了a的值10,然后进行运算加一,11就是这样得来的。
二、数组指针

格式:int (*p) [];
作用:用来存放指针,简单点说就是它把一些指针放在了一串连续的内存空间中,像数组一样把一堆数放在了一段内存中。
图例:
在这里插入图片描述

代码示例


	int (*p) [4] ;
	int arr[] = {45,6,7,3,6,75};
	p =&arr;
	printf("%p\n",*p);//指针1的地址
	printf("%d\n",**p);//arr[0]结果-->45
	printf("%d\n",**p+1);//解后+1------>45+1
	printf("%d\n",*(*p+1));//拿到指针2指向的值-->6

详解:
(*p)优先级高,说明它是一个指针,[4]他是一个数组,int是个整形。连起来就是他是一个数组指针,指向了含有4个元素的数组,并且他是个int型数组,称为数组指针,里面存放了4个指针,指针p指向了4个指针中的第一个。

  • 拿值过程:*p拿到指针1的地址,指针1里面放着数值地址,再解一层,通过数值地址拿到数值-----》**p。

  • **p+1、*(*p+1)跟上面的指针数组说过的是同一个思想,可以通过代码注释在复习下上面说过的内容很好理解啦!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值