前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不看技术文,还想不想去腾讯了

不看技术文,还想不想去腾讯了

作者头像
谭庆波
发布2018-12-19 11:21:18
3800
发布2018-12-19 11:21:18
举报
文章被收录于专栏:轮子工厂

写了篇退押金攻略《ofo,请把押金还给我!》之后,我又回归到我的 C 语言笔记分享上来了,真的希望它的浏览量可以像 ofo 那么高啊~所以喜欢的小伙伴要接着多多支持~

今天的内容主要是讲解指针数组。这部分内容实际上是要结合数组指针一起讲的,但是由于篇幅的问题,只能拆成两篇来写。今天这篇介绍指针数组,下一篇介绍数组指针。

1

指针和数组的区别

指针是左值,而数组名只是一个地址常量,它不可以被修改,所以数组名不是左值。其中的左值在 《听说学完这些你就可以出师了?》 中的 1.1 部分有讲,lvalue 指用于识别或定位一个存储位置的标识符,同时还必须是可改变的。PS:“什么学完就可以出师了,后面又写了这么多篇!骗人!”我想说:“嗯,因为舍不得你们嘛~” 这个土味情话怎么样~

在下面的这段程序中

执行代码会得到如下的错误

通过错误提醒可以知道,自加运算符 ++ 需要一个左值,虽然数组名是数组第一个元素的地址,但是他是不可变的,不满足左值的要求,即不是一个左值。但是指针是一个左值,所以我们只需要初始化一个指针为数组第一个元素的地址,就可以解决这个问题,具体代码如下

其中还有一点需要注意的就是,自加运算符 ++ 与取值运算符 * 相比,++ 的优先级要更高,所以*p++ 相当于先将指针指向当前位置的下一个位置,然后再取出当前地址的值,实际上就是在逐个的取出字符串中的值。执行上面的代码可以得到如下的结果

这个地方还可以引申出一个问题:c 语言中 while(p++); 与 while(p){p++;} 有什么区别?

区别在于退出循环后, p的值不一样。

例如 char *p="ABCD"; 执行完第一个while循环后,p指向的是’\0’后面的一个字节,p的结果是未知的;

而如果是执行第二个循环,则p指向的是’\0’,也就是’D’后面的一字节,即p=’\0’。如果忘记了可以回顾一下之前的文章《我真的快学不动了,怎么办?》中的 “自增自减运算符” 内容。

上面这段代码是不是和 《我真的快学不动了,怎么办?》 部分 指针的运算 很相似。在指针的运算中,我们是使用指针的方式定义了一个数组,因为指针中存放的是数组中第一个元素的地址,而数组中第一个元素的地址又是数组名,所以对于指针定义的数组,既可以使用数组的形式访问,又可以使用指针运算的方式访问。但是对于直接用数组形式定义的数组,由于数组名虽然和数组中第一个元素的地址相等,但是并不是一个左值,所以只可以数组的形式访问数组中元素,不可以使用指针的形式访问,除非向上面那样新定义一个指针。

2

数组指针

指针数组,从名字来理解,很容易看出它是一个数组,里面装的是指针。比如下面的这段代码

它就是一个指针数组,我们可以从运算符的优先级和结合性进行分析。数组下标的优先级要比取值运算符的优先级高,所以先入为主,p1 被定义为具有 5 个元素的数组。那么数组元素的类型呢?是整型吗?显然不是,因为还有一个星号,所以它们应该是指向整型变量的指针。所示上述代码所定义的数组如下所示

即指针数组是一个数组,数组中的元素是指针变量。

比如说下面这段代码

我们将指针数组中的每个元素初始化为一个字符串,这里之所以可以这样写是因为一个指针可以使用 char *p = "sss" 的方式进行初始化,所以如果想初始化一个指针数组,就可以通过上面的方式进行。在打印输出中使用 p1[i] 而不是 *p1[i] ,*p1[i] 将取出的是字符串中的第一个字符,而不能打印整个字符串。执行上面的代码会得到如下的结果

好啦~今天的内容的就到这里了,下节课烧脑预警哦~

3

参考

[1] “小甲鱼” 视频课程《带你学C带你飞》【第一季】P23 [2] 凉凉猫 CSDN博客 《二维数组及多维数组的指针总结》 [3] 百度知道 《c++中while(*p++);与while(*p){p++;}有什么区别?》

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 轮子工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写了篇退押金攻略《ofo,请把押金还给我!》之后,我又回归到我的 C 语言笔记分享上来了,真的希望它的浏览量可以像 ofo 那么高啊~所以喜欢的小伙伴要接着多多支持~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档