写点什么

【C 语言】进阶指针 Two

作者:謓泽
  • 2022 年 7 月 09 日
  • 本文字数:1718 字

    阅读完需:约 6 分钟

【C语言】进阶指针Two

🚩write in front🚩

🔎​​Hello,大家好我是泽 En,一起共同学习,多多指教(●'◡'●)🔎

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝

✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🖊

📢2021 年度博客之星物联网与嵌入式开发 TOP5~2021 博客之星 Top100~阿里云专家 ^ 星级博主~掘金⇿InfoQ 创作者~周榜 77»总榜 1479👋

🔥 指针数组使用场景

接下来,演示下指针数组的应用场景,情况。

如下代码所示 👇


#include<stdio.h>int main(void){  int a[5] = { 1, 2, 3, 4, 5 };  int b[5] = { 6, 7, 8, 9, 10 };  int c[5] = { 11, 12, 13, 14, 15 };  int *pa[3] = { a, b, c };  for (int i = 0; i < 3; i++)  {    int j = 0;    for (j = 0; j < 5; j++)    {      printf("%-2d ",pa[i][j]);    }    printf("\n");  }  return 0;}
复制代码


运行结果如下所示 👇



💥重点核心指针数组本质上其实是个数组,数组中存放的是指针(地址) 而已😅



🌀 数组指针

数组是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。那么以下列代码为例子,我们来分布图如下可进行观察 🧐


int arr[] = {1,2,3,4,5};
复制代码



定义数组时,要给出数组名和数组长度,数组名可以认为是一个指针,它指向数组的第 0 个元素。在 C 语言中,我们将第 0 个元素的地址称为数组的首地址。以上面的数组为例,下图是 arr 的指向:👇

数组指针是一种指向数组的指针,这句话在我看来是很重要的你能理解透彻的话,我觉得你的数组指针能上一个台阶多看多读几遍🥰

那么指针数组是怎么样的呢,如下代码所示 👇


int (*p)[10];
复制代码


从这里我们不难去发现,原来指针数组和数组指针形成根本问题就在于操作符大小的优先级关系所在,所以当你定义变量的时候一定要去注意这个问题,不然的话就会有根本性质的不同。


int arr[10] = {0};int (*p)[10] = &arr;
复制代码


上述代码当中取出的是数组的地址,注意取地址是取出数组所有的地址。arr 才是数组名首元素的地址相当于是 arr[0], 而上述代码中取地址是不一样的,这个要区分开来。

💥重点核心在上面的代码中 p 就是一个数组指针,它是可以存放数组的地址的!

再举出一个例子,如下代码所示 👇


double* d[10];double* (*pa)[10] = &d;
复制代码


首先  pa 是个指针 ***** ,然后先把 (pa) 先结合。pa 指向的是数组,指向的是 d 的数组有 10 个元素,所以这里一定是要写 10*个元素。切记!

💥注意:这个地方只能是 10 个元素,因为指向的数组它就是 10 个元素。

这样的话 pa 是一个指针指向的数组是 10 个元素,那么它所指向的类型是 double* 类型的。所以要在前面+上 double*, 所以,数组指针 p 指向的类型也必须要是 double* 类型的才可以。以上 pa 就 是 数组指针,和上面 p 都是属于是数组指针类型的。

不知道,你看完之后明白了 数组指针 和 指针数组 了没有,总之我刚学的时候真的是一脸懵逼。这两个总是能够搞混淆😅还放弃了不想学指针的念头哈哈,但是这是绝对不可以的 🤐



💥 &数组名 和 数组名

&数组名:取地址是取出它数组的地址

数组名  :数组名仅仅是表示它首元素的地址

如下代码所示 👇


int arr[10] = {0};int* p1 = arr;int (*p2)[10] = &arr;
复制代码


在上述代码所示👆

p1 只需要是 指针数组 就可以了

p2  它却需要的是 数组指针 就可以了

虽然,它们最后打印出来的值是一模一样的,但是他们的类型终究是不一样的。

如下代码所示 👇


#icnlude<stdio.h>int main(void){    int arr[10] = {0};    int* p1 = arr;    int (*p2)[10] = &arr;    printf("p1   = %p\n",p1);    printf("p1+1 = %p\n",p1+1);    printf("%p2  = %p\n",p2);    printf("%p2+1= %p\n",p2+1);        return 0;}
复制代码


指针类型决定指针+1 到底多少

p1 是一个整形指针+1,它会跳过个字节。

p2 是一个数组指针,p2 指向的是一个数组。于是,p2+1 就应该是跳过一个数组,指向对象的数组。

运行结果如下所示 👇



第一行的编译结果与第二行的编译结果相差了个字节,个整形类型。

第三行的编译结果与第四行的编译结果相差了 40 个字节,个整形类型。

💥重点核心以后取地址数组名的话,一定要是数组指针!

发布于: 刚刚阅读数: 6
用户头像

謓泽

关注

一起happy! 2022.01.29 加入

谁也不知道旅途的终点是怎么样的,现在只不过是开始。便全力以赴!终点必将是星辰大海。 2021年度博客之星物联网与嵌入式开发TOP5 2021博客之星Top100 阿里云专家博主^星级博主 CSDN⇿掘金⇿InfoQ[创作者]

评论

发布
暂无评论
【C语言】进阶指针Two_3月月更_謓泽_InfoQ写作社区