0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数组指针的基本概念与使用

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2022-08-14 15:39 次阅读

数组指针

整型指针:指向整型的指针

字符指针:指向字符的指针

数组指针:指向数组的指针

8b79f596-1add-11ed-ba43-dac502259ad0.png

基本概念

下面哪个是数组指针呢?

指针数组和数组指针的概念很容易混淆,一定要分清楚哦!

int *p1[10];int (*p2)[10];

p1是指针数组,每个元素的类型是int*

p2是数组指针,每个元素的类型是int(*)[10]

int (*p2)[10];//p2先和*结合,表示p2是一个指针变量//指向一个大小为10个整型的数组//所以p2是数组指针注:[ ]的优先级高于*,所以必须加上()来保证p2先和*结合

1.1、代码示例

int* parr[6];int* (*pp)[6] = &parr;

pp是一个数组指针,类型是int*(*)[6],存放的是int*类型的数组,该数组有6个元素

8ba8cdee-1add-11ed-ba43-dac502259ad0.png

一般情况下,去掉变量名,剩下的即为变量类型

如:int* (*pp)[6]去掉变量名pp,变量类型为int*(*)[6]

char arr[5];char (*pa)[5] = &arr;

pa也是一个数组指针,变量类型为char(*)[5],指向char类型的数组,该数组元素个数为5

1.2、错误示范

你肯定会有一个疑问,变量类型为int(*)[5]的数组指针,能否指向数组元素为3或者6的数组呢?

8bc6db22-1add-11ed-ba43-dac502259ad0.png

程序能够正常编译,但是会报出如下警告

warning C4048: “int (*)[5]”和“int (*)[3]”数组的下标不同

在正常编写代码的时候,我们还是得保证数组指针和原数组的元素个数一致!

arr和&arr的区别

在进一步了解数组指针之前,我们需要了解arr和&arr的区别

当我们用%p打印arr和&arr时,会发现它们的结果是相同的

8bd80b5e-1add-11ed-ba43-dac502259ad0.png

但这能说明arr和&arr等价了吗?

并不能!

再来看看下面这串代码

8be82f84-1add-11ed-ba43-dac502259ad0.png

arr+1跳过4个字节,一个元素int的大小

&arr+1跳过40个字节,整个数组的大小

其实&arr和arr虽然指向的地址值相同,但是意义不同!

&arr表示的是数组的地址,是int(*)[10]类型

arr表示数组首元素的地址,是int*类型

数组的地址+1,跳过整个数组的大小

所以&arr+1和&arr的差值为40

对应的int(*p)[5]和int* p1也有不同

p接收的是&arr,整个数组的地址

p1接收arr,数组首元素的地址

数组指针的使用

3.1打印一维数组

下面这串代码是用整型指针打印数组元素的情况

8c188260-1add-11ed-ba43-dac502259ad0.png

除了整型指针外,我们可以利用数组指针打印元素

int main(){  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };  int (*p)[10] = &arr;  int i = 0;  for (i = 0; i < 10; i++)  {    printf("%d ", *((*p) + i));        //*p-->arr  }  printf("
");  return 0;}

*p等价于arr,arr+i等价于&arr[i],对arr+i解引用就是arr[i]

8c2c2ae0-1add-11ed-ba43-dac502259ad0.png

但是这种方式实际上是把简单问题复杂化了:我们本来就可以用int*指针来打印数组元素,为何要利用数组指针来多此一举呢?

所以在一维数组里面,我们一般不会这么写

3.2、打印二维数组

假设我现在需要一个print函数来打印二维数组

在之前,我们一般会想到用这张方式传入二维数组

void print(int a[3][5], int r, int c);

当我们想用数组指针的时候,情况就有些变化了

数组名是数组首元素的地址

二维数组的首元素是第一行

二维数组的数组名表示第一行的地址

//main函数中print(arr,3,5);

这里prinf里面的arr就需要用数组指针来接收

该二维数组是3行5列,每一行都有5个元素,是一个int[5]的数组

对应的数组指针为int(*)[5]类型

void print(int(*p)[5], int r, int c)

这里的p指针指向的是二维数组第一行的地址

*p:对p直接解引用

相当于拿道了第一行元素的地址(把第一行看作数组,也就是数组的地址)

相当于是二维数组第一行首元素的地址

8c3c82d2-1add-11ed-ba43-dac502259ad0.png

对(p+i)解引用,就能拿到第i行第一个元素的地址

*(p+i)+j第i行第j个元素的地址

*(*(p+i)+j)第i行第j个元素

这一部分和上篇博客指针数组的内容相似

最终的函数实现如下

void print(int(*p)[5], int r, int c){  int i = 0;  for (i = 0; i < r; i++)  {    int j = 0;    for (j = 0; j < c; j++)    {      printf("%d ", *(*(p + i) + j));     }    printf("
");  }}int main(){  int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };  print(arr,3,5);  return 0;}

8c4928d4-1add-11ed-ba43-dac502259ad0.png

4练习:判断

这一站最重要的就是区别指针数组和数组指针

4.1 int arr[5]

int arr[5];

arr是一个整型数组,有5个元素,每个元素是int类型的

4.2 int*parr[10]

int*parr1[10];

parr1是一个数组,数组有10个int*类型的元素

所以parr1是指针数组

4.3 int (*parr2)[10]

int(*parr2)[10];

parr2和*结合,表示parr2是一个指针

去掉parr2即为它的变量类型int(*)[10]

所以parr2是一个数组指针

4.4 int(*parr3[10])[5]

int(*parr3[10])[5];

[]的优先级高于*

parr3先和[]结合,说明parr3是一个数组

该数组有10个元素,每一个元素都是一个数组指针,类型是int(*)[5]

该数组指针指向的数组有5个int类型的元素

8c5be186-1add-11ed-ba43-dac502259ad0.png

结语

第三站数组指针到这里就结束啦!

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4552

    浏览量

    66642
  • 数组指针
    +关注

    关注

    0

    文章

    5

    浏览量

    5202

原文标题:【C语言】指针进阶第三站,数组指针!

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言数组名和指针

    指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大
    发表于 08-27 17:48 599次阅读

    C语言中指针数组数组指针的区别

    指针数组之间存在着紧密的关系。在本文中,我们将探讨指针数组的关系、指针算术和数组遍历、多维
    发表于 08-17 15:29 275次阅读

    指针基本概念和运算

    指针基本概念和运算8.1 指针基本概念和运算 8.2 指针与一维数组  
    发表于 03-10 15:40

    指针数组数组指针的区别

    int (*p)[4];// 定义一个数组指针,指向含4个元素的一维数组数组元素是int类型。int *p[4];// 定义一个指针
    发表于 07-15 21:41

    数组指针的详细讲解

    数组指针的详细讲解
    发表于 10-16 08:44 0次下载

    详谈数组指针的区别与联系

    详谈数组指针的区别与联系
    的头像 发表于 06-29 15:18 2.2w次阅读
    详谈<b class='flag-5'>数组</b>和<b class='flag-5'>指针</b>的区别与联系

    指针数组数组指针的区别

    这里我们区分两个重要的概念指针数组数组指针
    的头像 发表于 06-29 15:30 1.9w次阅读
    <b class='flag-5'>指针</b><b class='flag-5'>数组</b>和<b class='flag-5'>数组</b><b class='flag-5'>指针</b>的区别

    理解函数指针、函数指针数组、函数指针数组指针

    理解函数指针、函数指针数组、函数指针数组指针
    的头像 发表于 06-29 15:38 1.4w次阅读
    理解函数<b class='flag-5'>指针</b>、函数<b class='flag-5'>指针</b><b class='flag-5'>数组</b>、函数<b class='flag-5'>指针</b><b class='flag-5'>数组</b>的<b class='flag-5'>指针</b>

    C语言中指针数组

    #define SIZE 10int arry[SIZE]={0,1,2,3,4,5,6,7,8,9}; //数组名arry表示数组首元素的地址*int p,temp;//可直接初始化定义指针
    发表于 01-13 13:11 3次下载
    C语言中<b class='flag-5'>指针</b>与<b class='flag-5'>数组</b>

    C语言指针数组的区别

    在C语言教程中我们使用通过数组名通过偏移和指针偏移都可以遍历数组,那么指针数组到底有什么区别??
    的头像 发表于 07-18 16:29 1518次阅读

    二维数组数组指针以及指针数组

    二维数组数组指针以及指针数组
    的头像 发表于 08-16 09:02 2250次阅读

    【C语言进阶】“数组指针”和“指针数组”都是啥跟啥?

    【C语言进阶】“数组指针”和“指针数组”都是啥跟啥?
    的头像 发表于 08-31 13:21 1667次阅读

    C语言中什么是指针数组

    在C语言中一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存
    的头像 发表于 03-10 15:26 1262次阅读

    数组指针不能混用的情况

    指针基本概念数组是一组相同类型的元素的集合,而指针是一个变量,它存储了一个地址,该地址指向内存中的某个位置。在 C/C++ 中,数组
    的头像 发表于 12-07 13:46 304次阅读

    数组指针不相同吗?数组指针有哪些区别

    数组就是指针指针就是数组,这样的言论在评论区看到不下于10次。
    的头像 发表于 12-13 16:34 344次阅读
    <b class='flag-5'>数组</b>和<b class='flag-5'>指针</b>不相同吗?<b class='flag-5'>数组</b>和<b class='flag-5'>指针</b>有哪些区别