说在前面

看了好声音,听了谢霆锋对学员说的那句话,压力之下快速成长,突然感慨万千,自己难道不就是这样吗?这个时候,千千万万的企业到学校招聘,有的人很容易拿到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学习笔记

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 ++ )
{
...
}

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

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

  1. 【C语言进阶深度学习记录】二十八 数组指针与指针数组的分析

    数组指针与指针数是非常重要的概念.面试中也是经常会被问到的 文章目录 1 数组的类型 1.1 定义数组的类型 2 数组指针 2.1 数组类型和数组指针的代码分析 3 指针数组 3.1 指针数组代码案例 ...

  2. 字符指针数组(二级指针)

    一.字符指针数组 - 1 1.字符指针数组概念 字符指针数组是指一个数组中的各个元素都是字符指针 或者是字符串(字符数组)的首地址 2.初始化 char *name[]={"zhangsan ...

  3. C语言(函数指针数组)详解

    要了解函数指针数组,可以从三个角度来分析.所谓函数指针数组,从字面意思上来解析,函数指针数组的组成有三个点,函数,指针,数组.首先我们知道,函数指针数组,是一个数组,数组的每个元素是函数指针,也就是一 ...

  4. c语言数组前const的作用,c语言中const的用法

    C语言作为一门新型高级编程语言,在计算机软件编程中具有较为广泛的应用和实现.下面小编就跟你们详细介绍下c语言中const的用法,希望对你们有用. c语言中const的用法如下: const的基本解释 ...

  5. C语言-指针-基础用法、运算、指针与数组、指针数组、多级指针、void指针和const修饰符-学习笔记08

    文章目录 1. 地址和变量 2. 指针 2.1 基本声明 2.2 指针的目标 3. 指针的运算 3.1 指针的赋值运算 3.2 指针的算术运算 3.2.1 指针与常量的加法与减法 3.2.2 两指针相 ...

  6. inline函数返回值_C++知识补充-指针,const,函数指针,指针数组,运算符重载

    嵌入式Linux:C++ 面试准备珍藏版本​zhuanlan.zhihu.com 明月照我心:123道c++笔试题汇总(含答案)​zhuanlan.zhihu.com 阿贵:常见C++笔试面试题整理​ ...

  7. const指针、数组指针、指针数组理解

    指针中,关键字const放在不同的位置表示的意义: 1.const int *p; 这种情况下,表示的是一个指向常量的指针,程序中不能通过指针来改变它所指向的值,但是指针本身的值可以改变,即指针可以指 ...

  8. 不懂就问--Java基本数据类型与数组(定义了int型二维数组a[6][7]后,数组元素a[3][4]前的数组元素个数)案例分析

    首先要知道java中的数组是线性排列的 其次要知道数组的初始标度为0 例如定义了一个二维数组 a[1][2],则数组详细为 [0][0]: [0][1]: [0][2]: [1][0]: [1][1] ...

  9. c语言指针数组 难点总结,C语言指针与数组的难点分析.pdf

    C语言指针与数组的难点分析,c语言指针数组,c语言二维数组指针,c语言指针数组初始化,c语言函数指针数组,c语言数组与指针,c语言结构体数组指针,c语言指向数组的指针,c语言字符串数组指针,c语言数组 ...

最新文章

  1. java多线程的题目_Java多线程一个有趣的题目
  2. mysql varchar int_MySQL中int、char、varchar的性能浅谈
  3. 成功解决 This graphics driver could not find compatible graphics hardware. You maycontinue installation,
  4. Oracle相关报错
  5. HDU_5249(百度之星D题)
  6. 时隙aloha协议仿真程序_工控ModbusTCP/IP协议仿真环境搭建
  7. Window服务的创建与删除
  8. Sub-process /usr/bin/dpkg returned an error code (1)解决办法
  9. Linux工作笔记-两Linux系统互传文件(使用SSH)
  10. 蚂蚁集团前三季度营收1181.91亿元 支付宝月活用户7.31亿
  11. linux下vi编辑器的命令大全,linux下VI编辑器命令大全(超级完整版)
  12. 修改mysql数据库默认字符集_MySQL数据库之修改mysql默认字符集的两种方法详细解析...
  13. 导出到word时,报错
  14. Java CompletableFuture.runAfterEither任何一个完成就执行Runnable
  15. Java基础:方法和类详解
  16. 计算机发展趋势起点,2020年烟台市中考芝罘、莱山、高新、牟平四区结果浅析...
  17. 常用于应届生面试的24道面试题
  18. 怎么做视频剪辑,教你几招
  19. 常用导线、电线连接方法、电工电线接线方法图解
  20. 深度学习: one-stage/two-stage/multi-stage 目标检测算法

热门文章

  1. Symfony2Book16:Symfony2内部02-内核
  2. 别扭翻译之decentralization
  3. 箱线图怎么判断异常值_原创【六西格玛工具解读】02——箱线图(Boxplot)
  4. python找出值为nan_Python Numpy:找到list中的np.nan值方法
  5. mac最好用的markdown_Markdown 语法简明教程 amp; Markdown 编辑器推荐
  6. 【Spring MVC学习】WebApplicationContext初始化的三种方式
  7. bootstrap-fileinput 使用
  8. php框架升级,【PHP开发框架】thinkphp怎么升级
  9. java倒计时自动关闭弹窗,打开页面弹出窗口子窗口定时自动关闭
  10. mysql 类似 user__类似于微博 用户最后一条动态的查询