📄 c primer plus
字号:
《C Primer Plus 5th Edition》精简
此精简版与原版有些出入。
整理人:风子 QQ:278542295
难点:
1、指针与数组、函数:
int zippo[4][2] = { {2,4}, {6,8}, {1,3}, {5, 7} }; // 二维数组
int (*pz)[2] = zippo; // pz是指针,指向一个包含2个元素的int数组。pz[2][1]==zippo[2][1];pz指向第1行,pz+1指向第2行
int * pax[2]; // pax是数组,是由两个指向int的指针构成的数组,pax[i]是一个int的地址
printf("%d\n", pz[2][1]);
int (* p2)[6]; // p2指向6个元素的int数组,p2[i]被解释为一个由6个整数构成的元素,p2[i][j]是一个int
p2 = (int (*)[6])malloc(n * 6 * sizeof(int));
int sum2(int ar[][4], int rows);
int sum4d(int ar[][12][20][30], int rows); // ar是四维数组指针
int sum4d(int (*ar)[12][20][30], int rows); // 与上面的方式等效,其中ar指向一个12x20x30的int数组
typedef int arr4[4]; // aar4是4个int的数组
typedef arr4 arr3x4[3]; // arr3x4 是3个aar4的数组
int sum2(arr3x4 ar, int rows);
typedef char (* FRPTC()) [5]; // 把FRPTC声明为一个函数类型,函数返回一个指针,此指针指向指向有5个元素的char数组的指针
typedef void(* V_FP_CHARP)(char *);
void show(V_FP_CHARP fp, char *); // 即 void show(void (* fp)(char *), char * str)
V_FP_CHARP pfun; // 即 void (*pfun)(char *);
2、复数
.......
-------------------------------------------------------------
内容 复习题 编程 答案
第一章 概述 12 25 25 551
第二章 C语言概述 26 41 42 551
第三章 数据和C 43 68 69 552
第四章 字符串和格式化输入 71 95 96 554
第五章 运算符、表达式和语句 98 122 124 556
第六章 C控制语句:循环 126 157 160 558
第七章 C控制语句:分支和跳转 163 195 197 561
第八章 字符输入/输出和输入确认 199 221 222 564
第九章 函数 223 253 254 564
第十章 数组和指针 255 290 292 566
第十一章 字符串和字符串函数 293 328 330 568
第十二章 存储类、链接和内存管理 332 361 362 570
第十三章 文件输入/输出 365 386 387 571
第十四章 结构和其他数据形式 389 430 432 573
第十五章 位操作 457 454 455 576
第十六章 C预处理器和C库 457 492 493 577
第十七章 高级数据表示 495 549 549 578
附录A 复习题答案 550
附录B 参考资料 581
-------------------------------------------------------------
附录B 参考资料 581
B.1 参阅书籍 581
B.2 C运算符 583
B.3 基本类型 587
B.4 表达式、语句、程序流 590
B.5 ANSI C库 595
B.5.1 诊断 assert.h 595
B.5.2 复数 complex.h (C99) 595
B.5.3 字符处理:ctype.h 597
B.5.4 错误报告:errno.h 597
B.5.5 浮点数环境:fenv.h (C99) 597
B.5.6 整型格式转换:inttypes.h (C99) 599
B.5.7 本地化:locale.h 599
B.5.8 数学库:math.h 601
B.5.9 非本地跳转:setjmp.h 604
B.5.10 信号处理:signal.h 604
B.5.11 可变参数:stdarg.h 605
B.5.12 布尔支持:stdbool.h 606
B.5.13 通用定义:math.h 606
B.5.14 整数类型:stdint.h 607
B.5.15 标准I/O库:stdio.h 610
B.5.16 通用工具:stdlib.h 611
B.5.17 字符串处理:string.h 615
B.5.18 通用数学函数宏:tgmath.h (C99) 617
B.5.19 日期时间:time.h (C99) 617
B.5.20 扩展的多字节字符和宽字符:wchar.h (C99) 619
B.5.21 宽字符分类和映射工具:wctype.h (C99) 624
B.6 扩展的整数类型 625
B.7 扩展的字符支持 628
B.8 C99的数值计算增强 631
B.9 C和C++的差别 633
-------------------------------------------------------------
第一章 概述
一、C的优点、缺点
1、优点
性能高效:紧凑且运行速度快,接近汇编
可移植性强:可以不同操作系统下的C编译器中编译
强大又灵活:UNIX、Linux 都是采用 C 编写的
2、缺点
C在表达方面的自由会增加风险,尤其是C对指针的使用不当,可能会产生难以追踪的问题;
C的简洁性与丰富的运算符相结合,如果不注意,有可能会编写出极难理解的代码;
.....
3、C标准
C语言没有官方的标准,Brian Kermighan 和 Dennis Ritchie 编写的
《The C Programming Language》第一版(1978)成为大家接受的标准,
通常称为 K&R C 或 经典C;而 UNIX 实现的C库成为事实的C标准库。
美国国家标准化组织(ANSI)于1989年采用C标准--ANSI C
国际标准化组织(ISO)于1990年采用C标准--ISO C
ISO与ANSI C实质上是同一标准,统称为C89
1994年,C90
1999年,C99
三、C与C++区别
四、各操作系统的C编译器:
C编译器和链接器是将C语言源代码转换为可执行的程序。
编译器将源代码(.c)转为目标文件(.obj);
链接器将目标文件(.obj)、系统的启动代码(程序与操作的接口)、库代码(.lib)结合可执行文件(.exe),
对于库代码,链接器只从库(.lib)中提取您使用的函数所需要的代码。
本书使用的操作系统和编译器:
Pentinum PC 机器上运行的 Windows XP Professional
VAX 11/750 机器上运行的BSD 4.3版本 UNIX
Pentinum PC 机器上运行的 Linux
Microsoft Visual C++7.1 (包含于Microsoft Visual Studio .NET 2003中)
Metrowerks CodeWarrior Development Studio 9.2
gcc 3.3.3、Comeau 4.3.3
这些版本的编译器都不完全支持C99的所有特性。
1、UNIX
编译器:cc
编译链接过程:.c --> .o --> .out
编辑器 emacs、jove、vi、X-Windows
备注:有些UNIX文件名最长8个字符,有些则允许最长255字符
使用举例:
cc test.c
cc file1.c file2.c
2、Linux
编译器:gcc
编译链接过程:.c --> .o --> .out
编辑器 emacs、jove、vi、X-Windows
备注:文件名最长255字符
使用举例:
gcc test.c
gcc file1.c file2.c
随后,如果file1.c有改动而file2.c不变,可以这么编译:
gcc file1.c file2.o
3、MS-DOS
编译器:Borland Trubo C、Microsoft C
编译链接过程:.c --> .obj --> .exe
+.lib
编辑器:edit
备注:文件名最长8个字符
使用举例:
tcc test.c 或 用 tc 集成开发环境
3、Windows
编译器:Microsoft Visual C++、Borland C++ Builder、Metrowerks CodeWarrior Development、Digital Mars...
都提供C编译器,还是集成开发环境(IDE)
备注:调试时,避免控制程序一闪而过,可以加 getchar() 函数
4、Macintosh OS
编译器:Metrowerks CodeWarrior Development (有 Windows 和 Macintosh 版本)
第二章 C语言概述
#include <stdio.h> /* 包含另一个文件 */
int main(void) /* 主函数,程序入口 */
{
int num; /* 定义一个名为num的变量 */
num = 1; /* 为num赋一个值 */
printf("I am a simple ");
printf("computer.\n");
printf("My favorite number is %d because it is first.\n",num);
return 0; /* 返回,程序结束 */
}
#include <stdio.h>
预处理指令,让编译器从库中抽取某些函数的代码,或者替代常量等。
stdio.h头文件包含了有关标准的输入和输出函数(例如printf())的调用信息,例如一些常量、函数说明等,
但是函数代码被包含在一个已经编译好的库文件中,而不是在stdio.h头文件中。
int main(void) C99标准
main() C90勉强接受,但C99不接受
void main() 不标准
/* 多行注释 */
// 单行注释 C99新增的注释方式,C++、Java、Delphi 都支持此注释方式
int num;
声明一个int类型的名为num的变量,对应某块内存。
传统上,C语言要求必须在一个代码块的开始处声明变量,在其语句中间不声明;
现在C99遵循C++的惯例,允许把声明放在代码块中的任何位置。
C99允许外部标识符最长31个字符,其他标识符63个字符。
C90允许外部标识符最长6个字符,其他标识符31个字符,有些编译器最长只允许8字符。
/* two_func.c -- a program using two functions in one file */
#include <stdio.h>
void butler(void); /* ISO/ANSI C function prototyping */
int main(void)
{
printf("I will summon the butler function.\n");
butler();
printf("Yes. Bring me some tea and writeable CD-ROMS.\n");
return 0;
}
void butler(void) /* start of function definition */
{
printf("You rang, sir?\n");
}
第三章 数据和C
一、数据类型关键字
1、数据类型关键字:
K&R int、long、short、unsigned、char、float、double
C90新增 signed、void
C99新增 _Bool、_Complex复数、_Imaginary虚数
2、存储单位:
bit 位,只能表示0或1
byte 字节,每字节为8位
word 字,原始Apple机的字为8位,80286兼容机的字为16位,Pentinum PC、Macintosh PowerPC的字是32位,另外还有64位甚至更长
二、基本数据类型
1、整数类型integer
short short int
int
long long int
unsigned unsigned int
C90新增
unsigned long unsigned long int
unsigned short unsigned short int
signed 可与有符号类型一起使用,例如:short、short int、signed short、singed short int 表示同一种类型
C99新增
long long long long int
unsigned long long unsigned long long int
典型系统的整数类型大小(bit)
Macintosh Metrowerks CW
类型 ANSI C 规定的最小值 PC机Linux、Windows XP DOS/Windows3.1
char 8 8 8
int 16 32 16
short 16 16 16
long 32 32 32
long long 64 64
例1、0x10表示十六进制数,020表示八进制数
int x = 100;
printf("dec=%d; octal=%o; hex=%x \n", x, x, x);
printf("dec=%#d; octal=%#o; hex=%#x \n", x, x, x);
输出结果:
dec=100; octal=144; hex=64
dec=100; octal=0144; hex=0x64
例2、尝试int超范围
/* toobig.c-exceeds maximum int size on our system */
#include <stdio.h>
int main(void)
{
int i = 2147483647; // -2147483648(0x80000000)~-1(0xFFFFFFFF),0~2147483647(0x7FFFFFFF)
unsigned int j = 4294967295; // 0~4294967295(0xFFFFFFFF)
printf("%d %d %d\n", i, i+1, i+2);
printf("%u %u %u\n", j, j+1, j+2);
return 0;
}
输出结果:
2147483647 -2147483648 -2147483647
4294967295 0 1
例3、尝试不匹配格式打印出不正确的结果
/* print2.c-more printf() properties */
#include <stdio.h>
int main(void)
{
unsigned int un = 3000000000; /* system with 32-bit int */
short end = 200; /* and 16-bit short */
long big = 65537;
long long verybig = 12345678908642;
printf("un = %u and not %d\n", un, un); // %u表示unsigned int,%d表示int
printf("end = %hd and %d\n", end, end); // %hd表示short int
printf("big = %ld and not %hd\n", big, big); // %ld表示long int
printf("verybig= %lld and not %ld\n", verybig, verybig); // %lld表示long long int
return 0;
}
输出结果:
un = 3000000000 and not -1294967296
end = 200 and 200
big = 65537 and not 1
verybig= 12345678908642 and not 1942899938
在short与int长度不一样的操作系统中,使用%d打印short效率更高。
整数常量示例
类型 十六进制 八进制 十进制
char \0x41 \0101 N.A
int 0x41 0101 65
unsigned int 0x41u 0101u 65u
long 0x41L 0101L 65L
unsigned long 0x41UL 0101UL 65UL
long long 0x41LL 0101LL 65LL
unsigned long long 0x41ULL 0101ULL 65ULL
可移植的类型:inttypes.h
C99定义了一些整型的别名,例如:
int16_t 表示一个16位有符号整数类型
uint32_t 表示一个32位无符号整数类型
int8_t
int_least8_t
int_fast8_t
intmax_t
uintmax_t
vc 没有 inttypes.h,可以自己定义
例1、可移植的整数类型名
/* altnames.c -- portable names for integer types */
#include <stdio.h>
#include <inttypes.h> // supports portable types
int main(void)
{
int16_t me16; // me16 a 16-bit signed variable
me16 = 4593;
printf("First, assume int16_t is short: ");
printf("me16 = %hd\n", me16);
printf("Next, let's not make any assumptions.\n");
printf("Instead, use a \"macro\" from inttypes.h: ");
printf("me16 = %" PRId16 "\n", me16); // PRId16在inttypes.h中定义,即"hd"
return 0;
}
2、字符类型char
char实际存储的是整数,美国最常用的编码是ASCII码,此编码1字节中的7位(0~127),例如字母A的值为65。
Unicode字符集能够表示世界范围内的多种字符集,目前已超96000个字符,使用16位甚至32位表示。
Unicode标准与ISO/IEC 10646标准兼容。
国标标准化组织 ISO -- International Organization for Standardization
国际电工技术委员会 IEC -- International Electrotechnical Commission
定义字符变量,并赋值
char grade = 'A'; // 将整数65存储在一个8位单元grade中
char grade = 65; // 与上一句等效,不过可读性差
singed char grade = 127; // C90允许加singed或unsigned,-128(0x80)~-1(0xFF),0~127(0x7F)
unsigned char grade = 255; // 0~255(0xFF)
int tag = 'FATE' // 将'FATE'四个字符存储在32位单元tag中,这是一个技巧
非打印字符,转义序列(Escape Sequence)
\a 警报,C90新增,ASCII值为7,例如 char beep='\a'; 与 char beep=7; 等效
\b 退格
\f 走纸
\n 换行,ASCII值为10
\r 回车,ASCII值为13
\t 水平制表符,ASCII值为9
\v 垂直制表符
\\ 反斜杠(\)
\' 单引号(')
\" 双引号(")
\? 问号(?)
\0oo 八进制值(o表示一个八进制数字),例如 char beep='\07'; 与 char beep='\007'; 等效
\xhh 十六进制(h表示一个十六进制数字)
例1、打印字符
/* charcode.c-displays code number for a character */
#include <stdio.h>
int main(void)
{
char ch;
printf("Please enter a character.\n");
scanf("%c", &ch); /* user inputs character */
printf("The code for %c is %d.\n", ch, ch);
return 0;
}
3、布尔类型:_Bool
_Bool类型由C99引入,_Bool类型实际上也是一种整数类型,
1表示true,0表示false,原则上它只需要1位存储空间。
4、浮点型
浮点变量的指数和尾数部分(有效数字)被分别存储。
float一般是32位,其中7位为有效数字,取值范围 3.4e-37~3.4e38
double一般是64位,其中15位为有效数字,取值范围 1.7e-307~1.7e308
典型系统的浮点类型的有效数字位数、指数
类型 ANSI C 规定的最小值 PC机Linux、Windows XP Macintosh Metrowerks CW
float 6位,-37~37 6位,-37~38 6位,-37~38
double 10位,-37~37 15位,-307~308 18位,-4931~4932
long double 10位,-37~37 18位,-4931~4932 18位,-4931~4932
浮点变量:
float noah, jonah;
double trouble;
float planck = 6.63e-34;
long double gnp;
浮点常量:
默认为double:3.14159、.2、4e16、.8E-5、100.、100.0f
加L为long double:54.31l、4.32e4L
浮点数表示方式:
1000.23 = 1.00025 X 10^3 = 1.00025e3
0.000056 = 5.6 X 10^-5 = 5.6e-5
C99添增浮点数常量的十六进制方式:
0xa.1fp10 = 10.12109375 X 1024 = 10364.0
a表示10;.1f表示1/16+15/256=0.12109375;p10表示2^10=024
并非所有的C编译器都支持此格式
float、double输出十进制%f、科学记数%e,另外C99新增十六进格%a
例1、打印浮点值
#include <stdio.h>
int main(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -