写点什么

【C 语言】进阶指针 Three

作者:謓泽
  • 2022 年 7 月 10 日
  • 本文字数:1776 字

    阅读完需:约 6 分钟

【C 语言】进阶指针 Three

🚩write in front🚩

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

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

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

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

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

🔥 数组是首元素地址但有②个例外

①. sizeof(数组名) - 数组名表示整个数组,计算的是整个数组大小,单位是字节。

🔥注意:sizoof(数组名)这个是必须要单独存放的才算是表示数组的整个大小!

②. &数组名 - 数组名表示整个数组,取出的是整个数组的地址。

除了上述这两个,sizeof(数组名) 和 &数组名 其它的表示都是数组名(arr)首元素的地址。



💥 数组指针的使用

💥注意: 使用数组指针的时候一般都不会在一维数组当中去使用!通常都是在二维数组中使用

大家可以思考下这是为什么,你可以试着去看看数组指针的形式在去思考🤔

那就假设我们先在一维数组当中去使用下,如下代码所示 👇


#include <stdio.h>int main(void){  int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };  int(*pa)[10] = &arr;  int i = 0;  for (i = 0; i < 10; i++)  {    printf("%d ", *((*pa) + i));  }    return 0;}
复制代码


上述代码👆,就是配合数组指针去使用的,可能小伙伴们看了会觉得很不自在我也觉得是,明明就可以用指针变量解决的一道题目,却还要用数组指针去解决。

指针变量解决,如下代码所示 👇


#include <stdio.h>int main(void){  int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };  int* pa = arr;  int i = 0;  for (i = 0; i < 10; i++)  {    printf("%d ",*pa+i);  }  return 0;}
复制代码


这样岂不是更方便吗?😜


接下来,我们来正确的使用数组指针。 如下代码所示 👇


#include <stdio.h>#define row 3#define col 3void print(int(*p)[col], int r, int c) //p是数组指针{  int i, j;  for (i = 0; i < row; i++)  {    for (j = 0; j < col; j++)    {      printf("\t%d ",*(*(p + i))+j);    }    printf("\n");  }}int main(void){  int arr[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };  print(arr, row, col);  return 0;}
复制代码


编译运行结果 👇



💥注意:二维数组的数组名表示首元素的地址,第一行是二维数组首元素地址!因为是一维数组的地址,所以在形参当中使用了指向一维数组指针来去进行使用。而这样的一维数组+i 的话相当于找到了第 i 行当中的地址,解引用相当于拿到了第 i 行的数组名。这又相当于这①行首元素的地址,然后再+上 j 的话就相当于 j 的地址。最后,再括起来解引用,就找到了第 i 行下标为 j 的地址进行引用 🥳



🌀 复杂类型说明

int p;
复制代码


这是一个普通的整型变量。


int *p;
复制代码


首先从 p 处开始,先与 * 结合,所以说明 p 是一个指针, 然后再与 int 结合, 说明指针所指向的内容的类型为 int 型。所以 p 是一个返回整型数据的指针。


 int p[3];
复制代码


首先从 p 处开始,先与 [] 结合,说明 p 是一个数组, 然后与 int 结合, 说明数组里的元素是整型的, 所以 p 是一个由整型数据组成的数组。


 int *p[3];
复制代码


首先从 p 处开始, 先与 [] 结合,因为其优先级比 * 高,所以 p 是一个数组, 然后再与 * 结合, 说明数组里的元素是指针类型, 然后再与 int 结合, 说明指针所指向的内容的类型是整型的, 所以 p 是一个由返回整型数据的指针所组成的数组。


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


首先从 p 处开始, 先与 * 结合,说明 p 是一个指针然后再与 [] 结合(与"()"这步可以忽略,只是为了改变优先级), 说明指针所指向的内容是一个数组, 然后再与 int 结合, 说明数组里的元素是整型的。所以 p 是一个指向由整型数据组成的数组的指针。


 int **p;
复制代码


首先从 p 开始, 先与 * 结合, 说是 p 是一个指针, 然后再与 * 结合, 说明指针所指向的元素是指针, 然后再与 int 结合, 说明该指针所指向的元素是整型数据。由于二级指针以及更高级的指针极少用在复杂的类型中, 所以后面更复杂的类型我们就不考虑多级指针了, 最多只考虑一级指针。


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


首先 pa 和 [] 进行结合了, pa 所接收的数组是 10 个。这里的 pa 是一个存储数组指针的数组,该数组能够存放 10 个数组指针,每个数组指针能够指向①个数组,数组⑤个元素,每个元素是 int 类型。​

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

謓泽

关注

一起happy! 2022.01.29 加入

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

评论

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