【 C 】指针数组案例分析(const的作用)

举报
李锐博恩 发表于 2021/07/15 07:25:46 2021/07/15
【摘要】 说在前面 看了好声音,听了谢霆锋对学员说的那句话,压力之下快速成长,突然感慨万千,自己难道不就是这样吗?这个时候,千千万万的企业到学校招聘,有的人很容易拿到offer,有的人却忧愁不已,还有一年的时间,这不就是压力所在吗?这一年可谓是让人快速成长的一年,不能再不温不火,而是要快马加鞭。导师的项目要努力做,能成为他的学生是缘分,负责到底;自己也要不断充电,为工作准备,这都需要...

说在前面

看了好声音,听了谢霆锋对学员说的那句话,压力之下快速成长,突然感慨万千,自己难道不就是这样吗?这个时候,千千万万的企业到学校招聘,有的人很容易拿到offer,有的人却忧愁不已,还有一年的时间,这不就是压力所在吗?这一年可谓是让人快速成长的一年,不能再不温不火,而是要快马加鞭。导师的项目要努力做,能成为他的学生是缘分,负责到底;自己也要不断充电,为工作准备,这都需要时间,对自己说,加油吧。原来我真的需要快速成长了!

主做硬件FPGA,项目FPGA+电子侦察,软件C、C++,有时间再补充点机器学习,神经网络,希望自己挺住!


引入

《C与指针》这本书是基础性的内容,关于指针数组以及指向数组的指针虽然基础,但也是当年学习C语言的拦路虎,也令自己困惑不已,今天看了这本书,突然觉得明朗了起来,再加上软件师兄帮我解答一部分疑惑,那就快速的把这部分内容记录下吧。

关于指向数组的指针,上次写过了一篇博文:指向数组的指针

这次主要讲指针数组,顾名思义,也许指针数组的意思就是数组中的元素就是一个又一个的指针。那下面按部就班,看看指针数组究竟是什么东西?


指针数组的含义

作为启发性的东西,我们看看下面这句话:

整型数组的意思就是数组中存放的是整型数值,那么指针数组是不是数组中存放的是指针呢?事实上确实如此!

且看下面的例子:

int   *api[ 10 ] ;

这是一个声明语句,为了弄清楚这个声明语句,我们假定它是一个表达式,并对它进行求值。

下标引用[]的优先级高于间接访问操作符*,如此以来,这个表达式首先执行下标引用。因此,api是某种类型的数组,而且是包含10个元素的数组。在取得一个数组元素后,对其执行间接访问操作符,这就很明显了,什么样的表达式可以执行间接访问操作,固然是指针变量或常量,对数组的元素执行间接访问操作,且得到的结果是一个整型值,所以元素本身是一个指针。

因此,最后总结,api肯定是一个数组,并且元素类型是指向整型的指针,这也便是指针数组的含义。


什么地方使用指针数组呢?

举个例子:


  
  1. char const *keyword[] = {
  2. "do",
  3. "for",
  4. "if",
  5. "register",
  6. "return",
  7. "switch",
  8. "while"
  9. };
  10. #define N_KEYWORD (sizeof( keyword ) / sizeof( keyword[0]) )

这里,解释下第一指针数组的声明并对其进行初始化,初始化的值是一个又一个的字符串“”,这其实代表的是该字符串的地址,也就是指针,所以,如此赋值是合理的(给指针数组赋值一个又一个指针是合理的)。特别关键的一点细节就是那个指针数组前面的关键字const,这个关键字针对的是char类型,也就是说给指针数组的元素赋值后,不能再改变其值了(不能改变的是该地址指向的内容),只能使用不能改变!(也即只读)!

有关const的用法,参看我的另两篇博文:const学习笔记

const进一步解读

下面继续:

注意sizeof的用途,它用于对数组中的元素进行自动计数。sizeof(keyword)的结果是整个指针数组所占用的字节数,而sizeof(keyword[0])的结果是数组中每个元素所占用的字节数。这两个值相除,结果就是数组元素的个数!

这个数组可以用于一个计算C源文件中关键字个数的程序中。输入的每个单词将与列表中的字符串进行比较,所有的匹配都将被计数。

下面的程序用于遍历整个关键字列表,查找是否存在与参数字符串相同的匹配。当它找到一个匹配时,函数就返回这个匹配在列表中的偏移量。调用程序必须知道 0 代表 do, 1 代表 for 等,此外它还必须知道返回值结果是 -1表示没有关键字匹配。

下面给出这个程序:


  
  1. //判断参数是否与一个关键字列表中的任何单词匹配,并返回匹配的索引值。如果未找到匹配,函数返回-1.
  2. #include<string.h>
  3. int lookup_keyword( char const * const desired_word,
  4. char const *keyword_table[], int const size )
  5. {
  6. char const **kwp;
  7. //遍历表中的每个单词
  8. for(kwp = keyword_table; kwp < keyword_table + size; kwp++ )
  9. {
  10. if( strcmp( desired_word, *kwp ) == 0)
  11. {
  12. return kwp - keyword_table;
  13. }
  14. }
  15. //没有找到关键字
  16. return -1;
  17. };

这个程序一开始令我迷惑的是里面运用了大量的const声明,更多分的是这条声明:

char const * const desired_word

竟然有两个const,这是什么情况呢?

首先,如果没有这两个const,我们都知道desired_word是一个指向char类型的指针变量,但在char后面加上第一个const后,表明该指针指向的变量值不能被改变了,处于只读状态;第2个const放到了*后面,意思是该指针本身一旦被赋值后,也是只读的,只能使用,不能在让它指向别的东西了。

实参传递给函数后,desire_word的值不能被改变了,只能使用,不能修改,包括desire_word本身以及它指向的字符常量,都只能使用,不能修改。

最后对上面那个程序进行改进一下:

对关键词列表的改进:


  
  1. char const *keyword[] = {
  2. "do",
  3. "for",
  4. "if",
  5. "register",
  6. "return",
  7. "switch",
  8. "while",
  9. NULL
  10. };

这里,我们在表的末尾增加了一个NULL指针。这个NULL指针使函数在搜索这个表时能能够检查到表的结束,而无需预先知道表的长度,如下:


  
  1. for(kwp = keyword_table; *kwp != NULL; kwp ++ )
  2. {
  3. ...
  4. }

这样的话是不是好多了,我们无需判断什么小于某个数,搜索结束,这样逻辑更加的清晰!

 

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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