⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c primer plus

📁 系统地学习、撑握C语言的经典书。 这是我整理、加工过的《C Primer Plus》精简版
💻
📖 第 1 页 / 共 5 页
字号:
《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 + -