当前位置: 首页 > news >正文

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

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

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

1
指针和数组的区别

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

在下面的这段程序中

640

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

640

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

640

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

640

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

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

640

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

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

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

2
数组指针

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

640

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

640

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

比如说下面这段代码

640

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

640

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

3
参考

[1] “小甲鱼” 视频课程《带你学C带你飞》【第一季】P23 

——//——

让知识成为信仰  让优秀成为习惯

往期精彩回顾
听说学完这些你就可以出师了?
我真的快学不动了,怎么办?
最适合程序员的理财方式是什么?

640点击 阅读原文,关注我的CSDN

相关文章:

  • 魔鬼的实验,请滚远一点!
  • 你想去小米吗?
  • 送6本书+12块STM32板子
  • Ofo彻底凉凉~
  • 腾讯又在搞事情了
  • 公布抽奖名单
  • 双非院校与985有哪些不同?
  • 真的全都是干货!!!
  • 计算机专业必读哪些经典书籍?
  • 从拖延症晚期到自律,我是怎么做到的?
  • 带你学C带你飞
  • 程序员最全进阶资源免费送
  • 公众号征稿,50-150元/篇
  • 程序员提高核心竞争力的几点干货
  • 送10本书,清华大学出版社出版
  • 5、React组件事件详解
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • canvas 五子棋游戏
  • DataBase in Android
  • es6要点
  • JavaScript 基础知识 - 入门篇(一)
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Map集合、散列表、红黑树介绍
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • PAT A1120
  • PhantomJS 安装
  • Python打包系统简单入门
  • Python爬虫--- 1.3 BS4库的解析器
  • VuePress 静态网站生成
  • vue数据传递--我有特殊的实现技巧
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于for循环的简单归纳
  • 精彩代码 vue.js
  • 力扣(LeetCode)22
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #14vue3生成表单并跳转到外部地址的方式
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $GOPATH/go.mod exists but should not goland
  • (二)linux使用docker容器运行mysql
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (七)c52学习之旅-中断
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .net中我喜欢的两种验证码
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • []C/C++读取串口接收到的数据程序