【 C 】指向数组的指针(数组指针)(行指针)

举报
李锐博恩 发表于 2021/07/15 05:56:00 2021/07/15
【摘要】 本博文内容参考:《C 和 指针》 本博文解决两个问题,一是如何访问二维数组的行,以及元素;二是如何定义指向数组的指针以及如何赋值等。 很简单,快速记录! 先给出一个案例,判断下面这两个声明以及赋值合法吗? int vector[10], *vp = vector; int matrix[3][10], *mp = matrix; 第一个声明是合法的。它为一个整型...

本博文内容参考:《C 和 指针》

本博文解决两个问题,一是如何访问二维数组的行,以及元素;二是如何定义指向数组的指针以及如何赋值等。

很简单,快速记录!


先给出一个案例,判断下面这两个声明以及赋值合法吗?

int vector[10], *vp = vector;

int matrix[3][10], *mp = matrix;

第一个声明是合法的。它为一个整型数组分配内存,并把vp声明为一个指向整型的指针,并把它初始化为指向vector数组的第一个元素。vector 和 vp具有相同的类型,都是指向整型的指针。也有区别,vp是指针变量,而vector是指针常量。

第二条声明语句是非法的,这里的非法是指对指针mp的赋值是不正确的,声明本身是没有问题的。

它正确地创建了一个matrix数组,并把mp声明为一个指向整型的指针。但是mp的初始化是不正确的,因为matrix并不是一个指向整型的指针常量,而是一个指向整型数组的指针。(它指向matrix数组的第一个元素,而这个元素又包含10个元素,更确切地说,也就是matrix指向该数组的第一行,也就相当于一个一维数组。)


我们怎么样声明一个指向整型数组的指针呢?

int (*p) [10];

这个声明作为一个重新捡起c语言的人来说应该是不难的,但是对于小白来说,肯定还是会吓出一身冷汗!

声明也不是乱声明的,肯定有它的道理,我们来分析下:

下标引用【】的优先级要高于间接访问*,但是括号的优先级最高,所以首先执行的还是间接访问。所以p还是一个指针,这个指针指向的是什么呢?

接下来执行的是下标引用,所以p指向某种类型的数组。这个声明表达式中并没有更多的操作符,所以数组的每个元素都是整数。

声明并没有告诉你p是什么?但推断它的类型并不困难,当我们对它执行间接访问操作时,我们得到的是数组,对该数组进行下标引用操作得到的是一个整型值。所以说,这个指针是指向整型数组的指针。

在生声明中加上初始化是这个样子:

int (*p)[10] = matrix;

它使p指向matrix的第一行。

p是一个指向拥有10个整型元素的数组的指针。当你把p与一个整数相加时,该整数值首先根据10个整型值的长度进行调整,然后执行加法。所以我们可以使用这个指针一行一行地在matrix中移动。

如果你需要一个指针逐个访问整型元素而不是逐行在数组中移动,你该怎么办?

下面两个声明都创建了一个简单的整型指针,并以两种不同的方式进行初始化,指向matrix的第一个整型元素。

int *pi = &matrix[0][0];

int *pi = matrix[0];

增加这个指针的值使它指向下一个整型元素。

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/82501909

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200