周立功手把手教你学C语言编程:用数组,构造一个双重指针
那一个。如果数据的个数不多,顺序搜索也很快。标准库中提供了一些函数,它们可以处理某些特定类型的顺序搜索问题,比如,strchr和strstr能搜索给定的字符串中的字符或子串,如果对某个数据类型有这种函数就应该直接使用它。
虽然搜索看起来非常简单,但它的工作量与被搜索数据的个数成正比。如果要找的的数据并不存在,而数据量加倍也会使搜索的工作量加倍。这是一种线性关系,其运行时间是数据规模的线性函数,因此这种搜索也被称为线性搜索。
>>>> 2. 字符串与二维数组
有两种风格描述C风格的字符串数组,即二维数组和指针数组,比如:
char keyWord[][6] = {"eagle", "cat", "and", "dog", "ball"};
char * keyWord[5] = {"eagle", "cat", "and", "dog", "ball"};
其中,第1个声明创建了一个二维数组,详见图 1.16(a)。第2个声明创建了一个指针数组,每个指针元素都初始化为指向各个不同的字符串常量,相加图 1.16(b)。
图 1.16 矩形数组和不规则数组
如果改用二维数组代替指针数组修改程序清单 1.44,这两种方法使用了相同的初始化列表,显示字符串的for循环代码也相同,因此只要修改形参和局部变量的声明即可。由于数组变量名的值是指针,因此无论传递给函数的是指针还是数组名,函数都能运行。尽管它们的声明不同,但从某些方面看起来,它们非常相似,两者都代表5个字符串。当使用一个下标时都分别表示一个字符串,但两者的类型并不相同。当使用2个下标时都分别表示一个字符,比如,keyWord[1][2]表示keyWord数组中第2个指针指向的字符串的第3个字母't'。初看上去二维数组的效率似乎低一些,因为它每一行的长度都被固定为刚好能容纳最长的关键字,但它不需要任何指针。另一方面,指针数组也要占用内存,但是每个字符串常量占用的内存空间只是它本身的长度。
如果它们的长度差不多,那么二维数组形式更紧凑一些。如果各个字符串的长度差别很大,绝大多是字符串都很短,只有少数几个很长,那么使用指针数组形式会更紧凑一些,取决于指针所占用的空间是否小于每个字符串都存储于固定长度的行所浪费的空间。实际上,除了非常巨大的表,它们之间的差别是非常小的,所以根本不重要。除非要改变其中的任何一个字符串,二维数组是更好的选择。
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)