数组指针和指针数组的区别详解
一、指针数组 格式: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
【指针|C语言中的数组指针和指针数组的区别,代码+图例详解】注意点:
- 为什么是**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) [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)跟上面的指针数组说过的是同一个思想,可以通过代码注释在复习下上面说过的内容很好理解啦!!
推荐阅读
- 数据结构|3000字带你深入理解二叉树(图解剖析)
- C语言|【C语言】#define 定义常量和宏
- C语言拯救者|C语言拯救者 番外篇 (函数栈帧的创建和销毁讲解)
- C语言系统学习学习手册|【C语言知识精讲③】函数栈帧的创建和销毁(全程图解)
- C语言基础|【C语言】函数栈帧的创建与销毁
- C语言|C语言实现扫雷游戏+优化(递归)
- c语言|初识c语言5——12.#define定义常量和宏、13.指针、14.结构体(struct关键字)
- c语言|链表刷题笔记(较难篇) (c实现)(跑路人笔记)
- c语言|(C语言底层逻辑)函数栈帧的创建和销毁讲解