《C和指针》笔记33:指针数组

这篇具有很好参考价值的文章主要介绍了《C和指针》笔记33:指针数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

除了创建整型数组一样,也可以声明指针数组。

int *api[10];

为了弄清这个复杂的声明,我们假定它是一个表达式,并对它进行求值。下标引用的优先级高于间接访问,所以在这个表达式中,首先执行下标引用。因此,api是某种类型的数组(它包含的元素个数为10)。在取得一个数组元素之后,随即执行的是间接访问操作。这个表达式不再有其他操作符,所以它的结果是一个整型值。

那么api到底是什么东西?对数组的某个元素执行间接访问操作后,我们得到一个整型值,所以api肯定是个数组,它的元素类型是指向整型的指针。

举一个使用指针数组的例子:

char const *keyword[]={
	"do",
	"for",
	"if",
	"register",
	"return",
	"switch",
	"while"
};
#define N_KEYWORD	\
(sizeof(keyword)/sizeof(keyword[0]))

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

这个数组可以用于一个计算C源文件中关键字个数的程序中。输入的每个单词将与列表中的字符串进行比较,所有的匹配都将被计数。程序8.2遍历整个关键字列表,查找是否存在与参数字符串相同的匹配。当它找到一个匹配时,函数就返回这个匹配在列表中的偏移量。调用程序必须
知道0代表do,1代表for等,此外它还必须知道返回值如果是-1表示没有关键字匹配。这个信息很可能是通过头文件所定义的符号获得的。

  • keyword.c 关键字查找
/*
** 判断参数是否与一个关键字列表中的任何单词匹配,并返回匹配的索引值。如果未** 找到匹配,函数返回-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;
}

书里没有把怎么使用的代码给出来,这里测试了一下,在这里写出:

#include <string.h>
#include <stdio.h>
char const *keyword[] = {
    "do",
    "for",
    "if",
    "register",
    "return",
    "switch",
    "while"};
#define N_KEYWORD \
  (sizeof(keyword) / sizeof(keyword[0]))
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;
}

int main()
{

  int a = lookup_keyword("while", keyword, N_KEYWORD );
  printf("%d", a);
}

也可以把关键字存储在一个矩阵中,如下所示:

char const keyword[][9] = {
	"do",
	"for"
	"if",
	"register",
	"return",
	"switch",
	"while"
};

这个声明和前面那个声明的区别在什么地方呢?第2个声明创建了一个矩阵,它每一行的长度刚好可以容纳最长的关键字(包括作为终止符的NUL字节)。这个矩阵的样子如下所示:

《C和指针》笔记33:指针数组,C和C++,c语言,指针数组
第1个声明创建了一个指针数组,每个指针元素都初始化为指向各个不同的字符串常量,如下所示:

《C和指针》笔记33:指针数组,C和C++,c语言,指针数组
注意这两种方法在占用内存空间方面的区别。矩阵看上去效率低一些,因为它的每一行的长度都被固定为刚好能容纳最长的关键字。但是,它不需要任何指针。另一方面,指针数组本身也要占用空间,但是每个字符串常量占据的内存空间只是它本身的长度

如果我们需要对之前的程序进行修改,改用矩阵代替指针数组,我们应该怎么做呢?答案可能会令你吃惊,我们只需要对列表形参和局部变量的声明进行修改就可以了,具体的代码无需变动。由于数组名的值是一个指针,所以无论传递给函数的是指针还是数组名,函数都能运行。书里忽略了具体的代码,这里写一下:

#include <string.h>
#include <stdio.h>
char const keyword[][9] = {
    "do",
    "for",
    "if",
    "register",
    "return",
    "switch",
    "while"};
int lookup_keyword(char const *const desired_word,
                   char const (*keyword_table)[9], int const size)//列表第二个形参发生改变
{
  char const(*kwp)[9];//这里发生了改变
  /*
  ** 对于表中的每个单词 ...
  */
  for (kwp = keyword_table; kwp < keyword_table + size; kwp++)
    /*
    ** 如果这个单词与我们所查找的单词匹配,返回它在表中的位置。
    */
    if (strcmp(desired_word, *kwp) == 0)
      return kwp - keyword_table;
  /*
  ** 没有找到。
  */
  return -1;
}

int main()
{

  int a = lookup_keyword("while", keyword, 7);//size等于7总共是7行
  printf("%d", a);
}

实际上,除了非常巨大的表,这些差别非常之小,所以根本不重要。人们时常选择指针数组方案,但略微对其作些改变:

char const *keyword[] = {
	"do",
	"for",
	"if",
	"register",
	"return",
	"switch",
	"while",
	NULL
};

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

for( kwp = keyword_table; *kwp != NULL; kwp++ )

参考文章来源地址https://www.toymoban.com/news/detail-728299.html

  1. 《C和指针》

到了这里,关于《C和指针》笔记33:指针数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【go语言基础】指针数组和数组指针

    (1)指针数组: 存储指针的数组,也叫存储地址的数组,简单说就是存储地址的。 首先它是一个数组,数组中的元素都是指针(地址)。 (2)数组指针: 首先它是一个指针,存储的是指向数组的指针。 (1)指针数组 定义: 注意:首先是一个数组,将数组中的元素定义为

    2024年02月13日
    浏览(53)
  • 【C语言】指针的基本知识详细讲解(指针数组、数组指针、函数指针....

    接着上次的函数的基本知识,今天我们来讲一讲🔍指针 目录 一、指针的概念 二、指针变量 三、野指针 四、字符指针 五、指针与数组 六、指针数组 七、数组指针  八、指针与函数 总结 一、指针的概念 1.1、变量和地址 所谓指针,也就是内存的地址;所谓指针变量,也就是

    2023年04月08日
    浏览(41)
  • C语言:指针和数组(看完拿捏指针和数组)

    目录 数组名的理解: 一维数组:  解析:  字符数组:  解析:   解析: 字符串数组:  解析:   解析:  一级指针:   解析:   解析:  二维数组:  解析:  指针笔试题: 题一:一维数组 题二: 结构体指针 题三: 一维数组 题四: 二维数组 题五: 二维数组 题

    2024年02月11日
    浏览(43)
  • 【C语言基础入门】二级指针、一维数组与指针、二维数组与指针

    在学习C语言的过程中,理解指针的概念是非常重要的。指针提供了一种直接访问内存地址的方式,使得我们可以更加灵活地管理数据和内存。在本文中,我们将介绍C语言中的二级指针、一维数组与指针,并通过通俗易懂的语言和示例代码来帮助读者理解这些概念。 二级指针

    2024年02月05日
    浏览(57)
  • 【C语言】指针进阶:字符指针&&数组指针&&函数指针

    ✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 🌹 感谢您的点赞与关注,同时欢迎各位有空来访我的 🍁平凡舍 回想之前,我们学了 指针 的一些基础👉 指针与结构体 我们知道了指针的概念: 指针就是

    2023年04月08日
    浏览(43)
  • C语言:指向数组的指针和指向数组首元素的指针

    相关阅读 C语言 https://blog.csdn.net/weixin_45791458/category_12423166.html?spm=1001.2014.3001.5482         指向数组的指针和指向数组首元素的指针常常被混淆,或者笼统地被称为数组指针,但它们之间是有差别的,本文就将对此进行讨论。         下面的代码首先创建了一个数组,然后创

    2024年02月02日
    浏览(52)
  • 【C语言】——指针七:数组和指针试题解析

         在前面的学习中,我们已经对C语言指针的知识有一个较为全面的了解,那么接下来我们做一些练习吧,即是检验我们的学习成果,也是对之前的知识的巩固。       1.1、 s i z e o f sizeof s i zeo f      因为后面的习题大量涉及 s i z e o f sizeof s i zeo f 与 s t r l

    2024年04月15日
    浏览(41)
  • C语言指针操作(三)通过指针引用数组

    通过指针引用数组的几种方法的原理和差异;以及利用指针引用数组元素的技巧 关于地址,指针,指针变量可以参考这篇文章: C语言指针操作(一)地址,指针,指针变量是什么 关于指针变量作为函数参数可以参考这篇文章: C语言指针操作(二)指针变量作为函数参数

    2024年02月04日
    浏览(49)
  • C语言的函数指针、指针函数, 函数数组

    是指向函数的指针,它允许您在程序运行时动态选择要调用的函数。函数指针可以像普通变量一样传递、存储和使用,这使得它们在许多编程场景中非常有用,如回调函数、函数表、插件架构等。 以下是一个简单的例子来说明函数指针的概念: 函数数组是一个数组,其中的

    2024年02月09日
    浏览(46)
  • 【C语言】指针篇-深入探索数组名和指针数组- 必读指南(2/5)

    🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C++笔记专栏: C++笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 在数组篇章,我们得到一个结论: 数组名是首元素的地址 验证环节 : 问题 :既然数组名是首元素的地址,那么为什么下面输出却不是预想的结果呢

    2024年04月28日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包