江湖车侠|C和指针:如何快速上手C语言( 六 )
现在让我们进入有趣的部分 。 在大多数其他语言中,我们将像下面这个样子编写循环:
它将读取一个字符 , 接下来如果我们尚未到达文件的末尾或读取的字符并不是换行符 , 它将继续读取下一个字符 。 注意这里两次出现了下面这条语句
C可以把赋值操作蕴含于while语句内部 , 这样就允许程序员消除冗余语句 。
一个经常问到的问题是:为什么ch被声明为整型,而我们事实上需要它来读取字符?答案是EOF是一个整型值,它的位数比字符类型要多,把ch声明为整型可以防止从输入读取的字符意外地被解释为EOF,但同时,这也意味着接收字符的ch必须足够大,足以容纳EOF ,这就是ch使用整型值的原因 。 正如第3章所讨论的那样,字符只是小整型数而已,所以用一个整型变量容纳字符值并不会引起任何问题 。
return语句就是函数向调用它的表达式返回一个值 。 在这个例子里,变量num的值被返回给调用该函数的程序,后者把这个返回值赋值给主程序的n_columns变量 。
1.1.5 rearrange函数
这些语句定义了rearrange函数并声明了一些局部变量 。 此处最有趣的一点是:前两个参数被声明为指针,但在函数实际调用时,传给它们的参数却是数组名 。 当数组名作为实参时,传给函数的实际上是一个指向数组起始位置的指针,也就是数组在内存中的地址 。 正因为实际传递的是一个指针而不是一份数组的拷贝,才使数组名作为参数时具备了传址调用的语义 。 函数可以按照操纵指针的方式来操纵实参,也可以像使用数组名一样用下标来引用数组的元素 。 第8章将对这些技巧进行更详细的说明 。
但是,由于它的传址调用语义,如果函数修改了形参数组的元素,它实际上将修改实参数组的对应元素 。 因此,例子程序把columns声明为const就有两方面的作用 。 首先,它声明该函数的作者的意图是这个参数不能被修改 。 其次,它导致编译器去验证是否违背该意图 。 因此,这个函数的调用者不必担心例子程序中作为第4个参数传递给函数的数组中的元素会被修改 。
这个函数的真正工作是从这里开始的 。 我们首先获得输入字符串的长度,这样如果列标号超出了输入行的范围,我们就忽略它们 。 C语言的for语句跟它在其他语言中不太像,它更像是while语句的一种常用风格的简写法 。 for语句包含3个表达式(顺便说一下,这3个表达式都是可选的) 。 第一个表达式是初始部分,它只在循环开始前执行一次 。 第二个表达式是测试部分,它在循环每执行一次后都要执行一次 。 第三个表达式是调整部分,它在每次循环执行完毕后都要执行一次,但它在测试部分之前执行 。 为了清楚起见,上面这个for循环可以改写为如下所示的while循环:
推荐阅读
- 定格|有的人演再多的喜剧,也掩盖不了江湖人物的锋芒
- 阿里巴巴|马云,江湖再见
- 滴滴出行|网约江湖:生态闭环的滴滴
- 琴歌解说|出怀旧服才是这个游戏的出路,热血江湖:别再弄手游了
- 天涯明月刀手游|三千万预约,天刀手游终测能否让玩家买单?阿暖带你云游江湖
- 鲜闻快讯|行走江湖的七个哲学思维,《我的前半生》唐晶安全友善并不幸福
- 江湖车侠|国产操作系统发布:售价99元,你愿意花费这个价格去尝试吗
- 江湖车侠|谁说小米等于性价比?千元5G实力派,OPPO和VIVO不差
- 艺统江湖|赵丽颖演过的十二部古装电视剧,你最喜欢她的哪个古装扮相?
- 北府财君|收益随即放大十倍,江湖上失传已久的炒股秘籍——仅靠这两招买入技巧
