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

版权声明:本博客内容来自于个人学习过程中的总结,参考了互联网以及书本、论文等上的内容,仅供学习交流使用,如有侵权,请联系我会重写!转载请注明地址! https://blog.csdn.net/Reborn_Lee/article/details/82529606

说在前面

看了好声音,听了谢霆锋对学员说的那句话,压力之下快速成长,突然感慨万千,自己难道不就是这样吗?这个时候,千千万万的企业到学校招聘,有的人很容易拿到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类型,也就是说给指针数组的元素赋值后,不能再改变其值了,只能使用不能改变!

下面继续:

注意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约束的是char,第二个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 ++ )
{
...
}

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

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/82529606
今日推荐