C 语言学习(3) ---- C语言中的 typedef 关键字

typedef 关键字定义

C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,typedef 的真正含义是给一个已经存在的类型名称起一个别名,注意是已经存在的数据类型,而非变量

typedef 可以给下面的类型取别名,基本数据类型,数组类型名称,指针类型名称和用户自定义的结构体类型,枚举类型,共用类型

一旦用户在程序中定义了自己的数据类型名称,就可以在该程序中用自己的数据类型来定义变量的类型,数组类型,指针变量类型和函数类型等,typedef 不是真正创造了一种数据类型,而是给已有的绘制复合型的以及复杂的数据类型取一个更加容易理解的别名。

typedef 定义基本类型

typedef signed char        int8_t;
typedef short              int16_t;
typedef int                int32_t;
typedef long long          int64_t;
typedef unsigned char      uint8_t;
typedef unsigned short     uint16_t;
typedef unsigned int       uint32_t;
typedef unsigned long long uint64_t;

上面是为已有的数据类型起了一个别名,使用 int8_t 的时候 就和使用 signed char 类型是一致的,此外,我们还可以使用这种方法来定义于平台无关的类型,这样,当跨平台移植程序时,我们只需要修改一下 typedef 的定义即可,而不用对其他源代码做任何修改。

typedef 定义指针和数组类型

//  pointer 一个指向 int 类型的指针类型
typedef int *pointer;

//  一个数组类型 pointerarray
typedef int *pointerarray[10];

//  数组指针类型arraypointer, 数组元素为 int 类型,数组大小为10
typedef int (*arraypointer)[10];

typedef int array[];

// 数组类型 fixedarray,数组元素为 int 类型,数组大小为10
typedef int fixedarray[10];

// 二维数组类型,数组元素为 int 类型,数组大小为10 *10 
typedef int fixedsarray[10][10];

typedef int *pointer 定义了一个指针类型,当我们使用 pointer p 声明一个指针变量就和使用 int *p 的含义是一样的

typedef int *pointerarray[10]  定义了一个数组类型,当我们使用 pointerarray p 声明变量 p,表示声明一个数组 p ,数组大小为10,数组的元素类型为 int*

    	/*p[0] = 0053F968
	p[1] = 0053F96C
	p[2] = 0053F970
	p[3] = 0053F974
	p[4] = 0053F978
	p[5] = 0053F97C
	p[6] = 0053F980
	p[7] = 0053F984
	p[8] = 0053F988
	p[9] = 0053F98C*/
	{
		int a[10] = {0};
		pointerarray p = {NULL};
		for (int i = 0; i < 10; i++) {
			p[i] = &a[i];
		}

		for (int i = 0; i < 10; i++) {
			printf("p[%d] = %p \n", i, p[i]);
		}
		printf("\n");
	}

typedef int (*arraypointer)[10]; 定义了一个数组指针类型,当我们使用 arraypointer p 声明变量 p,表示声明一个指针变量 p,p 指向一个元素类型为 int,大小为 10 的数组

typedef int fixedarray[10];
typedef int fixedsarray[10][10];

定义了两个数组类型,fixedarray a,表示定义了一个元素类型为 int,大小为10 的数组,同理fixedsarray 表示的是 10x10 的二维数组

typedef 定义结构体类型

typedef struct {
	int x;
	int y;
	int width;
	int height;
} stBufferinfo;

typedef struct {
	int x;
	int y;
	int width;
	int height;
} *pstBufferinfo;

typedef enum {
	MON,
	TUE,
	WED,
	THR,
	FRI,
	SAT,
	SUN,
} enweekday;

typedef enum {
	sMON,
	sTUE,
	sWED,
	sTHR,
	sFRI,
	sSAT,
	sSUN,
} *penweekday;

stBufferinfo 定义了一个结构类型,stBufferinfo bufferinfo 就表示定义了一个结构体,结构体类型为stBufferinfo,结构体变量名为 bufferinfo。

pstBufferinfo 定义了一个指针类型,指向的是pstBufferinfo 前定义的结构体类型

同理 enweekday 和 penweekday 也是定义了了一个枚举类型和指向枚举的指针类型

typedef 定义函数类型

typedef int stfunction(int a, int b);

typedef int  (*pstfunction)(int a, int b);

typedef int  *prstfunction(int a, int b);

stfunction 定义的是一个函数类型,此函数返回值为int,两个参数都是 int 类型,但是C语言中不存在函数的类型,使用时可以使用 stfunction* 的形式定义一个函数指针。

pstfunction 直接定义个函数指针类型

注意 prstfunction 和 pstfunction相比只是少了括号,含义却是一个函数类型,返回值为 int 类型指针,有两个int 类型的参数

	{
		stfunction *pfunc = CommonAdd;
		//stfunction *pfunc = &CommonAdd;
		printf("test pfunc a + b = %d \n", pfunc(10, 20));
		printf("test pfunc a + b = %d \n", (*pfunc)(10, 20));
	}
	printf("=========================================\n");

	{
		pstfunction pfunc = CommonAdd;
		printf("test pfunc a + b = %d \n", pfunc(10, 20));
		printf("test pfunc a + b = %d \n", (*pfunc)(10, 20));
	}
	printf("=========================================\n");

	{
		//prstfunction = CommonAdd;

	}

注意函数指针赋值时,可以直接使用函数名,也可以对函数名取地址。

typedef 和宏定义之间的关系

typedef 的功能是为已经存在的类型起一个别名,这一点 #define 也可以做到,但是除此之外 #define 还有其他用处,这个是 typedef 所不具备的。

从执行时间上讲,对于 #define 定义的宏,在预处理阶段就会被替换,而 typedef 的定义是在编译期间处理

从一般来说 #define 定义的宏没有作用域的限制,只要在使用前定义就可以,而 typedef 定义的别名是有作用域的(在文件头声明或者在函数中声明有区别)

我们使用 typedef 定义一个指针类型,然后使用该类型可以同时声明多个变量,而 #define 却不是这样的。例如,typedef (int*) pType; 可以使用pType a, b; 这里 a 和 b 都是指向整数的指针变量。但我们同样定义 #define pType int*, 若使用 pType a, b; 定义 a 和 b,则 a 是指向整数的指针变量,而 b 不是

从功能范围来讲,typedef 主要是为已经存在的关键字或者类型及其组合取一个我们容易识别的别名。在这一点上 #define 也可以实现,但除此之外 #define 还有其他用处,如果愿意的话你可以使用它定义任何代码,这是 typedef 所不具备的。

从执行时间来讲,对于 #define 定义的宏,其在预处理阶段就会被替换,而 typedef 定义的类型会在编译时处理。

从作用域上来讲,一般来说 #define 定义的宏没有作用域的限制,只要在使用前定义就可以,而 typedef 定义的别名是有作用域的。

从实现效果来讲,我们使用 typedef 定义一个指针类型,然后使用该类型可以同时声明多个变量,而 #define 却不是这样的。例如,typedef (int*) pType; 可以使用pType a, b; 这里 a 和 b 都是指向整数的指针变量。但我们同样定义 #define pType int*, 若使用 pType a, b; 定义 a 和 b,则 a 是指向整数的指针变量,而 b 不是。

还需要特别注意的是,虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的:

typedef static int marray[];

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 该资料是《C语言入门经典(第4版)》的源代码及课后练习答案 对应的书籍资料见: C语言入门经典(第4版) 基本信息 原书名: Beginning C: From Novice to Professional, Fourth Edition 原出版社: Apress 作者: (美)Ivor Horton 译者: 杨浩 出版社:清华大学出版社 ISBN:9787302170839 上架时间:2008-4-15 出版日期:2008 年4月 开本:16开 页码:571 版次:4-1 编辑推荐    本书是编程语言先驱者Ivor Horton的经典之作,是C语言方面最畅销的图书品种之一,在世界范围内广受欢迎,口碑极佳。    本书的目标是使你在C语言程序设计方面由一位初学者成为一位称职的程序员。 内容简介   本书是编程语言先驱者Ivor Horton的经典之作,是C语言方面最畅销的图书品种之一。本书集综合性、实用性为一体,是学习C语言的优秀入门教材,在世界范围内广受欢迎,口碑极佳。书除了讲解C程序设计语言,还广泛介绍了作为一名C程序设计人员应该掌握的必要知识,并提供了大量的实用性很强的编程实例。本书的目标是使你在C语言程序设计方面由一位初学者成为一位称职的程序员。读者基本不需要具备任何编程知识,即可通过本书从头开始编写自己的C程序。 作译者 作者   Ivor Horton是世界著名的计算机图书作家,主要从事与编程相关的咨询及撰写工作,曾帮助无数程序员步入编程的殿堂。他曾在IBM工作多年,能使用多种语言进行编程(在多种机器上使用汇编语言和高级语言),设计和实现了实时闭环工业控制系统。Horton拥有丰富的教学经验(教学内容包括C、C++、Fortran、PL/1、APL等),同时还是机械、加工和电子CAD系统、机械CAM系统和DNC/CNC系统方面的专家。IvorHorton还著有关于C、C++和Java的多部入门级好书,如《C语言入门经典(第4版)》和《C++入门经典(第3版)》。 译者   杨浩,知名译者,大学讲师,从事机械和计算机方面的教学和研究多年,发表论文数篇,参编和翻译的图书多达20余部,还曾多次获得市部级奖项。近几年一直在跟踪.NET技术的发展,积极从事.NET技术文档和图书的翻译工作。 目录 封面 -12 封底 572 前言 -9 目录 -6 第1章 C语言编程 1 1.1 创建C程序 1 1.1.1 编辑 1 1.1.2 编译 2 1.1.3 链接 2 1.1.4 执行 3 1.2 创建第一个程序 4 1.3 编辑第一个程序 4 1.4 处理错误 5 1.5 剖析一个简单的程序 6 1.5.1 注释 6 1.5.2 预处理指令 7 1.5.3 定义main()函数 7 1.5.4 关键字 8 1.5.5 函数体 8 1.5.6 输出信息 9 1.5.7 参数 10 1.5.8 控制符 10 1.6 用C语言开发程序 12 1.6.1 了解问题 12 1.6.2 详细设计 12 1.6.3 实施 13 1.6.4 测试 13 1.7 函数及模块化编程 13 1.8 常见错误 17 1.9 要点 17 1.10 小结 18 1.11 习题 18 第2章 编程初步 19 2.1 计算机的内存 19 2.2 什么是变量 21 2.3 存储数值的变量 21 2.3.1 整数变量 21 2.3.2 变量的命名 25 2.3.3 变量的使用 26 2.3.4 变量的初始化 28 2.3.5 算术语句 28 2.4 变量与内存 34 2.5 整数变量类型 35 2.5.1 无符号的整数类型 35 2.5.2 使用整数类型 36 2.5.3 指定整数常量 37 2.6 浮点数 38 2.7 浮点数变量 38 2.8 使用浮点数完成除法运算 39 2.8.1 控制小数位数 40 2.8.2 控制输出的字段宽度 41 2.9 较复杂的表达式 41 2.10 定义常量 44 2.10.1 极限值 46 2.10.2 sizeof运算符 49 2.11 选择正确的类型 50 2.12 强制类型转换 53 2.12.1 自动转换类型 53 2.12.2 隐式类型转换的规则 54 2.12.3 赋值语句的隐式类型转换 54 2.13 再谈数值数据类型 55 2.13.1 字符类型 56 2.13.2 字符的输入输出 57 2.13.3 宽字符类型 60 2.13.4 枚举 60 2.13.5 存储布尔值的变量 63 2.13.6 复数类型 63 2.14 赋值操作的op=形式 66 2.15 数学函数 68 2.16 设计一个程序 69 2.16.1 问题 69 2.16.2 分析 69 2.16.3 解决方案 71 2.17 小结 75 2.18 练习 76 第3章 条件判断 79 3.1 判断过程 79 3.1.1 算术比较 80 3.1.2 涉及关系运算符的表达式 80 3.1.3 基本的if语句 81 3.1.4 扩展if语句:if-else 84 3.1.5 在if语句使用代码块 86 3.1.6 嵌套的if语句 87 3.1.7 更多的关系运算符 90 3.1.8 逻辑运算符 93 3.1.9 条件运算符 97 3.1.10 运算符的优先级 99 3.2 多项选择问题 103 3.2.1 给多项选择使用else-if语句 104 3.2.2 switch语句 104 3.2.3 goto语句 113 3.3 按位运算符 114 3.3.1 按位运算符的op=用法 116 3.3.2 使用按位运算符 117 3.4 设计程序 120 3.4.1 问题 120 3.4.2 分析 120 3.4.3 解决方案 121 3.5 小结 124 3.6 练习 124 第4章 循环 127 4.1 循环 127 4.2 递增和递减运算符 128 4.3 for循环 129 4.4 for循环的一般语法 132 4.5 再谈递增和递减运算符 133 4.5.1 递增运算符 133 4.5.2 递增运算符的前置和后置形式 134 4.5.3 递减运算符 134 4.6 再论for循环 135 4.6.1 修改for循环变量 137 4.6.2 没有参数的for循环 138 4.6.3 循环内的break语句 138 4.6.4 使用for循环限制输入 141 4.6.5 生成伪随机整数 143 4.6.6 再谈循环控制选项 145 4.6.7 浮点类型的循环控制变量 146 4.7 while循环 147 4.8 嵌套循环 150 4.9 嵌套循环和goto语句 153 4.10 do-while循环 154 4.11 continue语句 157 4.12 设计程序 157 4.12.1 问题 157 4.12.2 分析 157 4.12.3 解决方案 158 4.13 小结 170 4.14 习题 170 第5章 数组 173 5.1 数组简介 173 5.1.1 不用数组的程序 173 5.1.2 什么是数组 175 5.1.3 使用数组 176 5.2 内存 179 5.3 数组和地址 182 5.4 数组的初始化 184 5.5 确定数组的大小 184 5.6 多维数组 185 5.7 多维数组的初始化 187 5.8 设计一个程序 191 5.8.1 问题 192 5.8.2 分析 192 5.8.3 解决方案 193 5.9 小结 200 5.10 习题 200 第6章 字符串和文本的应用 201 6.1 什么是字符串 201 6.2 处理字符串和文本的方法 203 6.3 字符串操作 206 6.3.1 连接字符串 206 6.3.2 字符串数组 208 6.4 字符串库函数 210 6.4.1 使用库函数复制字符串 210 6.4.2 使用库函数确定字符串的长度 211 6.4.3 使用库函数连接字符串 212 6.4.4 比较字符串 213 6.4.5 搜索字符串 216 6.5 分析和转换字符串 219 6.5.1 转换字符 222 6.5.2 将字符串转换成数值 225 6.7 使用宽字符串 225 6.8 设计一个程序 228 6.8.1 问题 229 6.8.2 分析 229 6.8.3 解决方案 229 6.9 小结 237 6.10 习题 237 第7章 指针 239 7.1 指针初探 239 7.1.1 声明指针 240 7.1.2 通过指针访问值 241 7.1.3 使用指针 244 7.1.4 指向常量的指针 248 7.1.5 常量指针 248 7.1.6 指针的命名 249 7.2 数组和指针 249 7.3 多维数组 252 7.3.1 多维数组和指针 255 7.3.2 访问数组元素 257 7.4 内存的使用 260 7.4.1 动态内存分配:malloc()函数 260 7.4.2 分配内存时使用sizeof运算符 261 7.4.3 用calloc()函数分配内存 265 7.4.4 释放动态分配的内存 265 7.4.5 重新分配内存 267 7.5 使用指针处理字符串 268 7.5.1 更多地控制字符串输入 268 7.5.2 使用指针数组 269 7.6 设计程序 280 7.6.1 问题 280 7.6.2 分析 281 7.6.3 解决方案 281 7.7 小结 291 7.8 习题 291 第8章 程序的结构 293 8.1 程序的结构 293 8.1.1 变量的作用域和生存期 294 8.1.2 变量的作用域和函数 297 8.2 函数 297 8.2.1 定义函数 298 8.2.2 return语句 301 8.3 按值传递机制 304 8.4 函数声明 305 8.5 指针用作参数和返回值 307 8.5.1 常量参数 310 8.5.2 从函数返回指针值 318 8.5.3 在函数递增指针 322 8.6 小结 322 8.7 习题 323 第9章 函数再探 325 9.1 函数指针 325 9.1.1 声明函数指针 325 9.1.2 通过函数指针调用函数 326 9.1.3 函数指针数组 329 9.1.4 作为变元的函数指针 331 9.2 函数的变量 334 9.2.1 静态变量:函数内部的追踪 334 9.2.2 在函数之间共享变量 336 9.3 调用自己的函数:递归 338 9.4 变元个数可变的函数 341 9.4.1 复制va_list 344 9.4.2 长度可变的变元列表的基本规则 344 9.5 main()函数 345 9.6 结束程序 346 9.7 函数库:头文件 347 9.8 提高性能 348 9.8.1 内联声明函数 348 9.8.2 使用restrict关键字 348 9.9 设计程序 349 9.9.1 问题 349 9.9.2 分析 349 9.9.3 解决方案 351 9.10 小结 367 9.11 习题 368 第10章 基本输入和输出操作 369 10.1 输入和输出流 369 10.2 标准流 370 10.3 键盘输入 371 10.3.1 格式化键盘输入 371 10.3.2 输入格式控制字符串 372 10.3.3 输入格式字符串的字符 377 10.3.4 输入浮点数的各种变化 378 10.3.5 读取十六进制和八进制值 379 10.3.6 用scanf()读取字符 381 10.3.7 scanf()的陷阱 383 10.3.8 从键盘上输入字符串 383 10.3.9 键盘的非格式化输入 384 10.4 屏幕输出 389 10.4.1 使用printf()格式输出到屏幕 389 10.4.2 转义序列 391 10.4.3 整数输出 392 10.4.4 输出浮点数 394 10.4.5 字符输出 395 10.5 其他输出函数 398 10.5.1 屏幕的非格式化输出 398 10.5.2 数组的格式化输出 399 10.5.3 数组的格式化输入 400 10.6 打印机输出 400 10.7 小结 401 10.8 习题 401 第11章 结构化数据 403 11.1 数据结构:使用struct 403 11.1.1 定义结构类型和结构变量 405 11.1.2 访问结构成员 405 11.1.3 未命名的结构 408 11.1.4 结构数组 408 11.1.5 表达式的结构 411 11.1.6 结构指针 411 11.1.7 为结构动态分配内存 412 11.2 再探结构成员 414 11.2.1 将一个结构作为另一个结构的成员 414 11.2.2 声明结构的结构 415 11.2.3 将结构指针用作结构成员 416 11.2.4 双向链表 420 11.2.5 结构的位字段 423 11.3 结构与函数 424 11.3.1 结构作为函数的变元 424 11.3.2 结构指针作为函数变元 425 11.3.3 作为函数返回值的结构 426 11.3.4 修改程序 430 11.3.5 二叉树 433 11.4 共享内存 442 11.4.1 联合 442 11.4.2 联合指针 444 11.4.3 联合的初始化 444 11.4.4 联合的结构成员 444 11.5 定义自己的数据类型 446 11.5.1 结构与类型定义(typedef)功能 446 11.5.2 使用typedef简化代码 447 11.6 设计程序 448 11.6.1 问题 448 11.6.2 分析 448 11.6.3 解决方案 448 11.7 小结 459 11.8 习题 459 第12章 处理文件 461 12.1 文件的概念 461 12.1.1 文件的位置 462 12.1.2 文件流 462 12.2 文件访问 462 12.2.1 打开文件 463 12.2.2 文件重命名 465 12.2.3 关闭文件 465 12.2.4 删除文件 466 12.3 写入文本文件 466 12.4 读取文本文件 467 12.5 将字符串写入文本文件 470 12.6 从文本文件读入字符串 471 12.7 格式化文件的输入输出 474 12.7.1 格式化文件输出 474 12.7.2 格式化文件输入 475 12.8 错误处理 477 12.9 再探文本文件操作模式 478 12.10 二进制文件的输入输出 479 12.10.1 指定二进制模式 479 12.10.2 写入二进制文件 480 12.10.3 读取二进制文件 480 12.11 在文件移动 488 12.11.1 文件定位操作 489 12.11.2 找出我们在文件的位置 489 12.11.3 在文件设定位置 490 12.12 使用临时文件 496 12.12.1 创建临时文件 496 12.12.2 创建唯一的文件名 496 12.13 更新二进制文件 497 12.13.1 修改文件的内容 502 12.13.2 从键盘读取记录 503 12.13.3 将记录写入文件 504 12.13.4 从文件读取记录 505 12.13.5 写入文件 506 12.13.6 列出文件内容 507 12.13.7 更新已有的文件内容 508 12.14 文件打开模式小结 515 12.15 设计程序 516 12.15.1 问题 516 12.15.2 分析 516 12.15.3 解决方案 516 12.16 小结 522 12.17 习题 522 第13章 支持功能 523 13.1 预处理 523 13.1.1 在程序包含头文件 523 13.1.2 外部变量及函数 524 13.1.3 替换程序源代码 525 13.1.4 宏替换 526 13.1.5 看起来像函数的宏 526 13.1.6 多行上的预处理指令 528 13.1.7 字符串作为宏参数 528 13.1.8 结合两个宏展开式的结果 529 13.2 预处理器逻辑指令 530 13.2.1 条件编译 530 13.2.2 测试指定值的指令 531 13.2.3 多项选择 531 13.2.4 标准预处理宏 532 13.3 调试方法 533 13.3.1 集成的调试器 533 13.3.2 调试阶段的预处理器 533 13.3.3 使用assert()宏 537 13.4 其他库函数 539 13.4.1 日期和时间函数库 539 13.4.2 获取日期 543 13.5 小结 549 13.6 习题 549 附录A 计算机的数学知识 551 附录B ASCII字符代码定义 559 附录C C语言的保留字 565 附录D 输入输出格式指定符 567 前言   欢迎使用《C语言入门经典(第4版)》。研读本书,你就可以成为一位称职的C语言程序员。从许多方面来说,C语言都是学习程序设计的理想起步语言C语言很简洁,因此无须学习大量的语法,就能够开始编写真正的应用程序。除了简明易学外,它还是一种功能非常强大的语言,至今仍被专业人士广泛使用。C语言的强大之处主要体现在,它能够进行各种层次的程序设计,从硬件设备驱动程序和操作系统组件到大规模的应用程序,都能胜任。事实上,任何计算机都支持C语言编译器,因此,当我们学会了C语言,就可以在任何环境下进行程序设计。最后一点,掌握了C语言,就为理解面向对象的C++语言奠定了良好的基础。.   积极热情的程序员都必将面对三大障碍,即掌握适用于所有程序设计语言的术语,理解如何使用一种语言的元素(而不仅仅只知道它们的概念)以及领会如何在实际环境应用这种语言,本书的目的就是将这些障碍降到最低。   术语是专业人士与优秀的业余人士们进行交流时必不可少的,因此掌握它们是必需的。本书会让你理解这些术语,并自如地在各种环境下使用它们。这样才能更有效地使用大多数软件产品附带的文档,且能轻松地阅读和学习大多数程序设计语言的相关文献。   显然,理解语言元素的语法和作用是学习一门语言的关键,不过认识语言的特性如何发挥作用和如何应用它们,也同等重要。在说明每种语言特性与特定问题的关系时,本书采用实际应用的程序示例,而不只是代码片断。这些示例提供了实践的基础,你可以任意改动它们,研究改动后的效果。   要理解在特定背景的程序设计方法,需要理解应用独立语言元素的机理。为了帮助理解它们,本书每章最后都给出一个较复杂的程序,该程序应用了本章前面已经学习的知识。这些程序可帮助你获得开发程序的能力和信心,了解如何综合运用各种语言元素。最重要的是,它们能让你了解设计真实程序时会遇到的问题以及如何管理实际的代码。   学习任何程序设计语言,都要认识几件事情。首先,要学的东西很多,但是掌握了它们之后,你会有极大的成就感。其次,学习的过程很有趣,你将体会到这一点。第三,你只有通过动手实践才能学会程序设计。最后,学习程序设计语言比你想象的容易得多,所以你肯定能掌握它。   如何使用本书   作者认为动手实践是最好的方法,你应当立刻开始编写自己的第一个程序。每一章都有几个把理论应用于实践的程序,这些示例是学习本书的关键。建议读者输入并运行文的示例,因为输入程序对记住语言元素有极大的帮助。此外,你还应该做每章后面的练习。当你第一次使一个程序运行起来,尤其是在试图解决自己的问题时,快速的进展会使你有很大的成就感。..   刚开始,学习的进展不会太快,不过随着逐渐深入,我们会加快学习的速度。每一章都会涉及很多基础知识,因此在学习新的内容之前,需要花些时间,确保理解了前面学过的所有知识。实践各部分的代码,并尝试实现自己的想法,这是学习程序设计语言的一个重要部分。尝试修改书的程序,看看还能让它们做什么,这是很有趣的。不要害怕尝试,如果不明白某一点如何使用,输入几种变体,看看会出现哪些情况。好的学习方法是先通读整章,全面了解其介绍的内容,然后再实践其的所有程序示例。   你可能会觉得某些章末尾的程序非常难。如果第一次读这样的程序没有完全理解,不必担心。第一次难免会觉得难以理解,因为它们通常都是把你所学的知识应用到了相当复杂的问题。如果你真的不能理解,可以略过那些章末尾的程序,继续学习下一章,然后再回头研究这些程序。甚至可以在学完全书之后再来研究它们。之所以演示这些程序是因为即使读完了本书,它们对你来说仍是非常有用的资源。   本书读者对象   本书的目的是教你如何尽可能简单快速地编写有用的程序,如果你属于下列情况之一,那么本书就非常适合你:   ●刚接触程序设计,但想直接深入了解C语言,从头开始学习程序设计及编写C语言程序。   ●以前有一点程序设计经历,对其基本概念有一定了解,也许曾经使用过BASIC或PASCAL。现在想学习C语言,进一步提高自己的程序设计技能。   本书并未假设此前你对程序设计的知识有所了解,不过本书会很快地从基本概念转入到实际应用。学完了本书,你就为自己的C语言程序设计奠定了全面的基础。   使用本书的条件   要使用本书,需要一台安装了C语言编译器和库的计算机,这样才能执行书的示例,还需要一个程序文本编辑器,用于创建源代码文件。你使用的编译器要很好地支持C语言国际标准:ISO/IEC 9899。你还需要一个用于创建和修改代码的编辑器,可以采用任何纯文本编辑器创建源程序文件,如Notepad或vi。不过,采用专为编辑C语言代码设计的编辑器更有帮助。   要最大限度地发挥本书的功效,你需要有学习的意愿、成功的渴望,当学习不顺利,觉得前途渺茫时,还要有坚持下去的决心。几乎每个人在初次学习程序设计时都会在某处觉得迷茫。当你发现自己艰难地掌握了C语言的某个方面时,要坚持下去,迷雾一定会消散,你会觉得为什么当初我不明白这一点呢?也许你明白要做到这些将会很难,不过相信你一定会惊讶自己能在较短的时间内取得很大进步。本书会帮助你开始自己的实践之旅,使你成为成功的程序设计员。   本书采用的约定   本书的文本和布局采用了许多不同的样式,以便区分各种不同的信息。大多数样式表达的含义都很明显,其程序代码以类似下面的样子出现: .  int main(void)   {   printf("\nBeginning C");   return 0;   }   如果代码片段是从前面的实例修改而来的,修改过的代码行就用粗体显示,如下所示:   int main(void)   {   printf("\nBeginning C by Ivor Horton");   return 0;   }   程序代码还使用了各种“括号”。它们之间的差别非常重要,不能互换。本书称( )为圆括号,{ }为大括号,[ ]为方括号。   本书源代码下载   从Apress的站点可以下载本书的所有代码和练习的解决方案:http://www.apress.com。也可以访问www.tupwk.com.cn/downpage下载本书的所有代码和解决方案。...   
目 录 摘 要 1 前 言 2 正 文 3 1. 采用类C语言定义相关的数据类型 3 2. 各模块的伪码算法 5 3. 函数的调用关系图 9 4. 调试分析 10 5. 测试结果 11 6. 源程序(带注释) 14 总 结 22 参考文献 23 致 谢 24 摘 要 目前,计算器应用很广泛,本程序是关于这方面的,其主要功能是进行简单的四则运算 ,其特点之一是支持带括号的四则运算;二是用到栈的一些相关操作,不但对操作有提示,还对与异常输入信息报错。 通过该题目的设计过程,可以加深理解线性表及栈的逻辑结构、存储结构,掌握线性表及栈上基本运算的实现,进一步理解和熟练掌握课本所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。 关键字:堆栈,初始化栈,入栈,出栈。 前 言 很多涉及计算器程序的的算法都是以栈的相关操作为基础,通过计算器的设计,有利于在学习更好的理解栈及其相关的操作。 通过对计算器计算过程演示,看到了到它的一些性能及相关优势。 我们在写程序时,大框架已成的情况下,仍然发现有些错误很难找到,对于这样的问题,可以利用计算机纠错功能,先运行,再根据题提示修改和完善程序。 在计算器用到的算法c语言算法可读性很强,一方面,是因为c语言是高级语言,是面向程序员的语言,二是c语言的功能是很完备的,可以达到事半功倍的效果,和其他语言相比量是比较少。栈的应用使该程序更出色。 正 文 1. 采用类c语言定义相关的数据类型 计算器的演示功能如下: A. 提示输入格式 B. 提示输入 C. 显示输入信息 D. 对有异常的输入报错并重新输入 E. 使用顺序栈实现数据的输入 (1)/*定义堆栈*/ typedef struct{ double data[M]; int top; }Stack; (2)/*初始化堆栈*/ InitStack(Stack *s) { s->top=0; } (3)/*判断栈是否为空*/ int StEmpty(Stack *s) { if(s->top==0) { return 1; } else { return 0; } } (4)/*入栈操作*/ StPush(Stack *s,double x) { if(s->top==M) { printf("The stack is overflow!"); } else { s->top=s->top+1; s->data[s->top]=x; } }
译者序 作者简介 技术审校人员简介 第1章 前言 1.1 本书的内容 1.2 本书的组织方式 1.3 致谢 第1部分 Objective-C语言 第2章 Objective-C程序设计 2.1 编译并运行程序 2.1.1 使用Xcode 2.1.2 使用Terminal 2.2 解释第一个程序 2.3 显示变量的值 2.4 小结 2.5 练习 第3章 类、对象和方法 3.1 到底什么是对象 3.2 实例和方法 3.3 用于处理分数的Objective-C类 3.4 @interface部分 3.4.1 选择名称 3.4.2 实例变量 3.4.3 类和实例方法 3.5 @implementation部分 3.6 Program部分 3.7 实例变量的访问以及数据封装 3.8 小结 3.9 练习 第4章 数据类型和表达式 4.1 数据类型和常量 4.1.1 int类型 4.1.2 float类型 4.1.3 double类型 4.1.4 char类型 4.1.5 限定词:long、long long、short、unsigned及signed 4.1.6 id类型 4.2 算术表达式 4.2.1 运算符的优先级 4.2.2 整数运算和一元负号运算符 4.2.3 模运算符 4.2.4 整型值和浮点值的相互转换 4.2.5 类型转换运算符 4.3 赋值运算符 4.4 计算器类 4.5 位运算符 4.5.1 按位与运算符 4.5.2 按位或运算符 4.5.3 按位异或运算符 4.5.4 一次求反运算符 4.5.5 向左移位运算符 4.5.6 向右移位运算符 4.6 类型:_Bool、_Complex和_Imaginary 4.7 练习 第5章 循环结构 5.1 for语句 5.1.1 键盘输入 5.1.2 嵌套的for循环 5.1.3 for循环的变形 5.2 while语句 5.3 do语句 5.4 break语句 5.5 continue语句 5.6 小结 5.7 练习 第6章 选择结构 6.1 if语句 6.1.1 if-else结构 6.1.2 复合条件测试 6.1.3 嵌套的if语句 6.1.4 else if结构 6.2 switch语句 6.3 Boolean变量 6.4 条件运算符 6.5 练习 第7章 类 7.1 分离接口和实现文件 7.2 合成存取器方法 7.3 使用点运算符访问属性 7.4 具有多个参数的方法 7.4.1 不带参数名的方法 7.4.2 关于分数的操作 7.5 局部变量 7.5.1 方法的参数 7.5.2 static关键字 7.6 self关键字 7.7 在方法分配和返回对象 7.8 练习.. 第8章 继承 8.1 一切从根类开始 8.2 通过继承扩展—添加新方法 8.2.1 Point类和内存分配 8.2.2 @class指令 8.2.3 具有对象的类 8.3 重载方法 8.3.1 择哪个方法 8.3.2 重载dealloc方法和关键字super 8.4 通过继承扩展:添加新的实例变量 8.5 抽象类 8.6 练习 第9章 多态、动态类型和动态绑定 9.1 多态:相同的名称,不同的类 9.2 动态绑定和id类型 9.3 编译时和运行时检查 9.4 id数据类型与静态类型 9.5 有关类的问题 9.6 使用@try处理异常 9.7 练习 第10章 变量和数据类型 10.1 类的初始化 10.2 作用域回顾 10.2.1 控制实例变量作用域的指令 10.2.2 外部变量 10.2.3 静态变量 10.3 存储类说明符 10.3.1 auto 10.3.2 const 10.3.3 volatile 10.4 枚举数据类型 10.5 typedef语句 10.6 数据类型转换 10.6.1 转换规则 10.6.2 符号扩展 10.7 练习 第11章 分类和协议 11.1 分类 11.2 协议 11.3 合成对象 11.4 练习 第12章 预处理程序 12.1 #define语句 12.1.1 更高级的定义类型 12.1.2 #运算符 12.1.3 ##运算符 12.2 #import语句 12.3 条件编译 12.3.1 #ifdef、#endif、#else和#ifndef语句 12.3.2 #if和#elif预处理程序语句 12.3.3 #undef语句 12.4 练习 第13章 基本的C语言特性 13.1 数组 13.1.1 数组元素的初始化 13.1.2 字符数组 13.1.3 多维数组 13.2 函数 13.2.1 参数和局部变量 13.2.2 函数的返回结果 13.2.3 函数、方法和数组 13.3 结构 13.3.1 结构的初始化 13.3.2 结构数组 13.3.3 结构的结构 13.3.4 关于结构的补充细节 13.3.5 不要忘记面向对象编程思想 13.4 指针 13.4.1 指针和结构 13.4.2 指针、方法和函数 13.4.3 指针和数组 13.4.4 指针运算 13.4.5 指针和内存地址 13.5 联合 13.6 它们不是对象 13.7 其他语言特性 13.7.1 Compound Literal 13.7.2 goto语句 13.7.3 空语句 13.7.4 逗号运算符 13.7.5 sizeof运算符 13.7.6 命令行参数 13.8 工作原理 事实#1:实例变量存储在结构 事实#2:对象变量实际上是指针 事实#3:方法是函数,而消息表达式是 函数调用 事实#4:id类型是通用指针类型 13.9 练习 第二部分 Foundation框架 第14章 Foundation框架简介 第15章 数字、字符串和集合 15.1 数字对象 15.2 字符串对象 15.2.1 NSLog函数 15.2.2 可变对象与不可变对象 15.2.3 可变字符串 15.2.4 所有对象到哪里去了 15.3 数组对象 15.4 同步AddressCard方法 15.4.1 快速枚举 15.4.2 数组排序 15.5 词典对象 15.6 集合对象 15.7 练习 第16章 使用文件 16.1 管理文件和目录:NSFileManager 16.1.1 使用NSData类 16.1.2 使用目录 16.1.3 枚举目录的内容 16.2 使用路径:NSPathUtilities.h 16.2.1 常用的路径处理方法 16.2.2 复制文件和使用NSProcessInfo类 16.3 基本的文件操作:NSFileHandle 16.4 练习 第17章 内存管理 17.1 自动释放池 17.2 引用计数 17.2.1 引用计数和字符串 17.2.2 引用计数与实例变量 17.3 自动释放池示例 17.4 内存管理规则摘要 17.5 垃圾回收 17.6 练习 第18章 复制对象 18.1 copy和mutableCopy方法 18.2 浅复制与深复制 18.3 实现协议 18.4 用赋值方法和取值方法复制对象 18.5 练习 第19章 归档 19.1 使用XML属性列表进行归档 19.2 使用NSKeyedArchiver归档 19.3 编码方法和解码方法 19.4 使用NSData创建自定义档案 19.5 使用归档程序复制对象 19.6 练习 第三部分 Cocoa和iPhone SDK 第20章 Cocoa简介 20.1 框架层 20.2 接触Cocoa 第21章 编写iPhone应用程序 21.1 iPhone SDK 21.2 第一个iPhone应用程序 21.2.1 创建新的iPhone应用程序项目 21.2.2 输入代码 21.2.3 设计界面 21.3 iPhone分数计算器 21.3.1 启动新的Fraction_Calculator项目 21.3.2 定义视图控制器 21.3.3 Fraction类 21.3.4 处理分数的Calculator类 21.3.5 设计UI 21.4 小结 21.5 练习 第四部分 附录 附录A 术语表 附录B Objective-C 2.0语言概览 附录C 地址簿源代码 附录D 资源
### 回答1: 要遍历C语言关键字,可以使用C语言标准库的<string.h>头文件和<ctype.h>头文件的函数。下面是一种实现方式: 1. 定义一个字符数组来存储C语言的所有关键字,例如: ``` char *keywords[] = {"auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "int", "long", "register", "return", "short", "signed", "sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile", "while"}; ``` 2. 对于输入的每个单词,使用C语言标准库的<ctype.h>头文件的函数检查它是否为关键字。例如,使用strcmp函数比较输入的单词是否与数组的任何一个关键字相等: ``` int is_keyword(char *word) { int i, n; n = sizeof(keywords) / sizeof(char *); for (i = 0; i < n; i++) { if (strcmp(word, keywords[i]) == 0) { return 1; } } return 0; } ``` 3. 对于输入的每个单词,还需要使用C语言标准库的<ctype.h>头文件的函数将其转换为小写字母,以便与关键字数组的字符串进行比较。例如,使用tolower函数将单词转换为小写字母: ``` void to_lower(char *word) { while (*word) { *word = tolower(*word); word++; } } ``` 4. 最后,可以将输入的文本分解成单词,并调用is_keyword函数和to_lower函数来检查它们是否为关键字。 以下是一个完整的示例程序,演示如何遍历C语言关键字: ``` #include <stdio.h> #include <string.h> #include <ctype.h> char *keywords[] = {"auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "int", "long", "register", "return", "short", "signed", "sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile", "while"}; int is_keyword(char *word) { int i, n; n = sizeof(keywords) / sizeof(char *); for (i = 0; i < n; i++) { if (strcmp(word, keywords[i]) == 0) { return 1; } } return 0; } void to_lower(char *word) { while (*word) { *word = tolower(*word); word++; } } int main() { char text[] = "for (int i = 0; i < n; i++) { printf(\"%d\\n\", i); }"; char *word; word = strtok(text, " "); ### 回答2: 在C语言关键字是预定义的标识符,用于表示语言的特殊功能和结构。要遍历C语言关键字,可以按照以下步骤进行: 1. 创建包含C语言所有关键字的数组。根据C语言的标准,可以将关键字存储在一个字符串数组。 2. 使用循环结构,遍历数组的每个关键字。可以使用for循环或while循环来实现遍历。 3. 在循环,将每个关键字打印出来或进行其他操作。可以使用printf函数将关键字输出到控制台上,也可以将其存储在新的数组或其他数据结构。 4. 执行完循环后,即可遍历所有的C语言关键字。 下面是一个简单的示例代码,用于遍历C语言关键字: ```c #include<stdio.h> #include<string.h> int main() { char* keywords[] = {"auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "int", "long", "register", "return", "short", "signed", "sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile", "while"}; int numKeywords = sizeof(keywords) / sizeof(keywords[0]); for(int i = 0; i < numKeywords; i++) { printf("%s\n", keywords[i]); } return 0; } ``` 以上代码通过使用循环遍历并打印出C语言的所有关键字。运行代码后,会依次打印出每个关键字,完成关键字的遍历。 ### 回答3: 要遍历C语言关键字,首先需要了解C语言关键字有哪些。C语言关键字是由编译器预先定义的,用于表示特定功能或命令的保留字。 C语言关键字共有32个,包括基本数据类型(如int、float、char等)、流程控制语句(如if、while、for等)、函数定义关键字(如void、return等)等。 遍历C语言关键字可以采用以下步骤: 1. 定义一个字符串数组,用于存储C语言关键字。 2. 创建一个循环,循环变量从0到31(因为C语言一共有32个关键字)。 3. 在循环,依次将每个关键字赋值给字符串数组的元素。 4. 遍历完所有关键字后,输出或处理字符串数组关键字。 以下是示例代码: ``` #include <stdio.h> #include <string.h> int main() { char keywords[32][10] = {"auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else", "enum", "extern", "float", "for", "goto", "if", "int", "long", "register", "return", "short", "signed", "sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile", "while"}; int i; for (i = 0; i < 32; i++) { printf("%s\n", keywords[i]); } return 0; } ``` 以上代码会将C语言关键字遍历并逐个输出。可以根据实际需求,将关键字存储到其他数据结构,或进行其他处理操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值