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