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

数组指针和指针数组的区别详解 一、指针数组 格式:int *p [4];
作用:用来存放地址,意思就是这个数组里面的4个内存空间放的都一些数值地址,这些地址是指向一些定义过的数值。
图例:
指针|C语言中的数组指针和指针数组的区别,代码+图例详解
文章图片

代码示例:

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) [];
作用:用来存放指针,简单点说就是它把一些指针放在了一串连续的内存空间中,像数组一样把一堆数放在了一段内存中。
图例:
指针|C语言中的数组指针和指针数组的区别,代码+图例详解
文章图片

代码示例:
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)跟上面的指针数组说过的是同一个思想,可以通过代码注释在复习下上面说过的内容很好理解啦!!

    推荐阅读