持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
🚩write in front🚩
🔎大家好,我是泽奀,希望你看完后。能对你有所帮助,不足请指正,共同学习交流🔎
🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家^星级博主~掘金⇿InfoQ创作者~周榜34»总榜1712🏅
🆔本文由 謓泽 原创 CSDN首发🙉如需转载还请通知⚠
📝个人主页-掘金 (juejin.cn)💬
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏-[C系列] 从0到1 - 泽奀的专栏 - 掘金 (juejin.cn)🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩
🔥 数组是首元素地址但有②个例外
①. 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 3
void 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类型。