【 C 】指针数组案例分析(const的作用)
说在前面
看了好声音,听了谢霆锋对学员说的那句话,压力之下快速成长,突然感慨万千,自己难道不就是这样吗?这个时候,千千万万的企业到学校招聘,有的人很容易拿到offer,有的人却忧愁不已,还有一年的时间,这不就是压力所在吗?这一年可谓是让人快速成长的一年,不能再不温不火,而是要快马加鞭。导师的项目要努力做,能成为他的学生是缘分,负责到底;自己也要不断充电,为工作准备,这都需要时间,对自己说,加油吧。原来我真的需要快速成长了!
主做硬件FPGA,项目FPGA+电子侦察,软件C、C++,有时间再补充点机器学习,神经网络,希望自己挺住!
引入
《C与指针》这本书是基础性的内容,关于指针数组以及指向数组的指针虽然基础,但也是当年学习C语言的拦路虎,也令自己困惑不已,今天看了这本书,突然觉得明朗了起来,再加上软件师兄帮我解答一部分疑惑,那就快速的把这部分内容记录下吧。
关于指向数组的指针,上次写过了一篇博文:指向数组的指针
这次主要讲指针数组,顾名思义,也许指针数组的意思就是数组中的元素就是一个又一个的指针。那下面按部就班,看看指针数组究竟是什么东西?
指针数组的含义
作为启发性的东西,我们看看下面这句话:
整型数组的意思就是数组中存放的是整型数值,那么指针数组是不是数组中存放的是指针呢?事实上确实如此!
且看下面的例子:
int *api[ 10 ] ;
这是一个声明语句,为了弄清楚这个声明语句,我们假定它是一个表达式,并对它进行求值。
下标引用[]的优先级高于间接访问操作符*,如此以来,这个表达式首先执行下标引用。因此,api是某种类型的数组,而且是包含10个元素的数组。在取得一个数组元素后,对其执行间接访问操作符,这就很明显了,什么样的表达式可以执行间接访问操作,固然是指针变量或常量,对数组的元素执行间接访问操作,且得到的结果是一个整型值,所以元素本身是一个指针。
因此,最后总结,api肯定是一个数组,并且元素类型是指向整型的指针,这也便是指针数组的含义。
什么地方使用指针数组呢?
举个例子:
-
char const *keyword[] = {
-
"do",
-
"for",
-
"if",
-
"register",
-
"return",
-
"switch",
-
"while"
-
};
-
-
#define N_KEYWORD (sizeof( keyword ) / sizeof( keyword[0]) )
这里,解释下第一指针数组的声明并对其进行初始化,初始化的值是一个又一个的字符串“”,这其实代表的是该字符串的地址,也就是指针,所以,如此赋值是合理的(给指针数组赋值一个又一个指针是合理的)。特别关键的一点细节就是那个指针数组前面的关键字const,这个关键字针对的是char类型,也就是说给指针数组的元素赋值后,不能再改变其值了(不能改变的是该地址指向的内容),只能使用不能改变!(也即只读)!
有关const的用法,参看我的另两篇博文:const学习笔记
下面继续:
注意sizeof的用途,它用于对数组中的元素进行自动计数。sizeof(keyword)的结果是整个指针数组所占用的字节数,而sizeof(keyword[0])的结果是数组中每个元素所占用的字节数。这两个值相除,结果就是数组元素的个数!
这个数组可以用于一个计算C源文件中关键字个数的程序中。输入的每个单词将与列表中的字符串进行比较,所有的匹配都将被计数。
下面的程序用于遍历整个关键字列表,查找是否存在与参数字符串相同的匹配。当它找到一个匹配时,函数就返回这个匹配在列表中的偏移量。调用程序必须知道 0 代表 do, 1 代表 for 等,此外它还必须知道返回值结果是 -1表示没有关键字匹配。
下面给出这个程序:
-
//判断参数是否与一个关键字列表中的任何单词匹配,并返回匹配的索引值。如果未找到匹配,函数返回-1.
-
-
#include<string.h>
-
-
int lookup_keyword( char const * const desired_word,
-
char const *keyword_table[], int const size )
-
{
-
-
char const **kwp;
-
//遍历表中的每个单词
-
for(kwp = keyword_table; kwp < keyword_table + size; kwp++ )
-
{
-
if( strcmp( desired_word, *kwp ) == 0)
-
{
-
return kwp - keyword_table;
-
}
-
-
}
-
-
//没有找到关键字
-
return -1;
-
-
-
};
这个程序一开始令我迷惑的是里面运用了大量的const声明,更多分的是这条声明:
char const * const desired_word
竟然有两个const,这是什么情况呢?
首先,如果没有这两个const,我们都知道desired_word是一个指向char类型的指针变量,但在char后面加上第一个const后,表明该指针指向的变量值不能被改变了,处于只读状态;第2个const放到了*后面,意思是该指针本身一旦被赋值后,也是只读的,只能使用,不能在让它指向别的东西了。
实参传递给函数后,desire_word的值不能被改变了,只能使用,不能修改,包括desire_word本身以及它指向的字符常量,都只能使用,不能修改。
最后对上面那个程序进行改进一下:
对关键词列表的改进:
-
char const *keyword[] = {
-
"do",
-
"for",
-
"if",
-
"register",
-
"return",
-
"switch",
-
"while",
-
NULL
-
};
这里,我们在表的末尾增加了一个NULL指针。这个NULL指针使函数在搜索这个表时能能够检查到表的结束,而无需预先知道表的长度,如下:
-
for(kwp = keyword_table; *kwp != NULL; kwp ++ )
-
{
-
...
-
}
这样的话是不是好多了,我们无需判断什么小于某个数,搜索结束,这样逻辑更加的清晰!
文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。
原文链接:reborn.blog.csdn.net/article/details/82529606
- 点赞
- 收藏
- 关注作者
评论(0)