您现在的位置是:网站首页 > 学无止境
C/C++与数据结构 王立柱 学习笔记
C_C++与数据结构(第4版)上册 王立柱 学习笔记 读书笔记 记录于:海淀区北部文化中心图书馆
第1章 机器语言模式
机器语言machine language 是一个机器指令集,又称为机器码machine code。每一条指令都是计算机可以直接执行的。
一条机器指令包含操作码和操作数两部分,前者是操作内容,后者是数据所在的存储单元地址,有时直接就是数据。
例如,01H 3000H是一条机器指令,其中01H是操作码,3000H是操作数地址,具体意思就是:取出地址为3000H存储的单元中数据,存入到CPU的寄存器A中。其中,H表示操作码01和地址3000都是用十六进制表示二进制数。
机器指令是用二进制编码的,不容易记忆和阅读。
助记符是缩写的英文字符,与操作码的功能相对应;表示地址的符号即符号地址。
助记符和符号组成的指令集合称为 汇编语言。汇编语言必须经过翻译,才能转变为机器语言程序,才能被计算机执行。完成翻译的程序叫汇编程序。利用汇编程序将汇编语言的程序翻译成机器语言的过程叫汇编。汇编语言程序称为源代码,翻译后的机器语言程序称为目标代码。
第2章 C语言模式
机器语言是二进制代码语言,汇编语言是符号化的机器语言,高级语言是算法语言。
计算机内存是一个物理上连续的字节序列,每一个字节都有一个用无符号的整数表示的地址。相邻的字节,地址相差1。
32位操作系统中,字节数是2^32(4GB),如果用十六进制表示地址,取值范围是0x0000 0000 ~ 0xffff ffff。
数据在C语言中存在方式可以用(地址,类型)来概括。从一个地址所标识的字节开始,由连续多少字节构成的一种数据的存储空间,以上面格式来存储这种数据,对这种数据可以实施哪些基本操作,都由类型来决定。
案例:三数 123 逆序输出
思路:
个位取模%
十位 除后取模
百位 除100
在32位操作系统,整型变量占4GB(以补码形式表示),最高位(左第1位)表示符号(0表示正,1表示负),剩余位表示数值。数值范围是-2^32~2^31-1,一个整数运算结果超出数值范围就是算术运算溢出。
do...while 、while、for 循环 整数逆序输出
int a;
for(a=345;a!=0;a/=10)
printf("%d",a%10);
C语言数据类型基本有:基本类型和复合类型
基本类型有:内置类型(整数、实型、字符型、空型)和自定义类型(枚举型)
复合数据类型有:内置类型(指针、数组)、标准库类型(字符串类型、文件类型)、用户定义类型(结构体、共同体)
算术运算:+ - * / %
关系运算:> < <= >= != 判断运算
逻辑运算:&& || !取反
整型字面量前加符号0x表示十六进制常量,数值含有数字0-9和a-f(A-F),a-f表示10-15,例如 0x12fe
整型字面量前加符号0,表示八进制常量,数值包括0-7,例如0127。
单精度浮点型对象占4B,其余都占8B。
实数除法运算保留小数,整数除法舍去小数。
128个标准字符--ASCII码
a-97 z-122 A-65 Z-90 从0开始,前2,后三空,第2为♢ 第126位~ 空格32 数字48-57
表达式时指具有确定的运算式,它既和运算数有关,又和运算符有关。
常量、赋值的变量式表达式,称为常量和变量表达式。
每个表达式都可以作为一条语句,而每条语句未必是一个表达式,例如,有空语句,但没有空表达式。
表达式:
k = (i++) + (++j) 等价于 ++j; i+j ; i++
++(++i) 等价于 ++i; ++i;
float x;
scanf("%f",&x); //输入-3.14
printf("%g",x>=0?x:-x); //输出3.14 绝对值
逻辑与(&&)和逻辑或(||)的运算均从左至右运算,如果左边有一个代表整个逻辑表达式的结果,那么右边不参与计算,这个情况称为短路。
假设: int a=5,b=6,c=7
(a>b)&&(c=c*2) 短路,因为左元a>b的结果为0,故右元c=c*2不执行。
(a>b)||(c=c-7) 不短路,因为左元a>b结果为0,故右元c=c-7需执行。
转换遵循原则是:小类型提升为大类型,防止数据被截断truncation,损失精度。
程序流程控制结构:选择分支结构(if...else、switch)和循环结构(while、do...while、for)
第3章 函数
形参列表中的变量为 形参。
被调函数名(实参列表) 实参列表格式为 表达式1,表达式2,表达式3,...表达式n
实参列表中的表达式为 实参。
返回值
return用法: 1.返回值 2.终止函数继续执行
没有返回值的函数,return可以省略,这样函数,不能作为表达式。
定义与声明 区别?
声明式介绍名字,说明名字是什么意思。
定义是为了分配存储空间。函数参数列表就是变量的声明,只有当函数被调用时,形参才分配存储空间,才有了定义。
函数定义就是要求编译器生成代码,并为之分配存储空间。
函数声明,也称为函数原型,是告诉编译器:一个函数将接受几个参数,每个参数是什么类型,函数是否右返回值,如果有,是什么类型。目的是使编译器能够检查函数调用是否正确。
变量作用域,是指变量应在程序哪一部分可以直接引用,即在程序中哪一部分是可见的。
作用域边界有3种:函数、块和文件。
变量的生命周期是指变量空间从创建到撤销的这段时间。
局部变量又分为 自动局部变量auto和静态局部变量static两种,形参只能是自动局部变量(自变量),前面可以加auto,一般可省
静态局部变量在声明前 加关键字static,它必须初始化,默认初始化值为0,初始化语句只在函数第一次被调用时执行一次,以后调用不再执行,静态局部变量生命周期从初始化到整个程序结束,存储在 内存种 静态存储区。
外部变量:在函数外部定义的变量称为外部变量,默认初始化为0,生命周期从编译阶段开始,到程序结束,作用域是定义之后的所有函数都可以引用。函数局部变量和外部变量同名是,外部变量无效。
无参宏指令定义格式:
#define 宏名 宏体
宏名是符号常量,也称为宏常量,通常是大写字母,经过预处理,宏名被宏体替换。
宏定义不是语句,最后不能加分号。
例如:
#define PI 3.1415926
#define FORMAT "a=%d,b=%d
" 使用 :printf(FORMAT,a,b)
#define OR ||
有参宏指令定义格式:
#define 宏名(形参表) 宏体
#define S(r) r*r*3.1415926
宏体多行,换行可以加做标识。
#define OUT(TD) printf(#ID"
"); #ID"
"中#表示ID代表的字符串要和后面的子串"
"连接。
printf("********
");
编译宏指令
#ifdef 宏名
程序段1
[#else
程序段2]
#endif
#ifdef 宏名
程序段1
#else
程序段2
#endif
文件包含指令
#include<文件名>
首先到命令行指定的目录中查找文件,没找到则去系统指定的标准目录一般为include目录照,不查找当前的工作目录。一般用于系统的标准头文件。
#include "文件名"
首先到当前工作目录中查找文件,没找到继续查找命令行指定的其它目录,还没找到,查找系统指定的标准目录,这种一般用户自定义的头文件。
第4章 一维数组和指针
int total(int n);
x = total(x); 假设x=1234567
分析有几次复制?
值传递,如果实参空间很大,复制时既费时,又费空间。
值传递和直接访问时联系在一起的。
一个对象的指针包括 对象的地址和类型,通过对象指针访问对象称为间接访问。
int x = 123456;
int *p
p=&x;
或
int *p = &x; 初始化,指针传递方式
指针类型是复合类型。
指针传递与值传递相比,复制次数要少。不管对象空间占多大,其地址只占4个字节。指针传递省时,省地,高效。
int *p
int* p
int * p 三种均ok
如果一个语句定义多个变量,那么*就要靠近指针变量,不能靠近 基本类型标识符。
int *p1,*p2;
int n,*np;
某种类型的指针,是指该指针是这种类型的对象指针。
某种类型的指针指针变量,是指 该指针的指 应该是这种类型的对象的地址。
数组是一个线性连续结构。所谓线性就是,除了 首尾元素外,每个元素 最多只有一个前驱或后驱。
数组元素常常数以万计,要节省空间和时间,数组又不能作为实参值传递,只能指针传递。
数组作为实参应该传递的指针是数组的首元素指针。
int a[5] = {1,2,4,5,0};
int *p;
p=a
或
int * p = a;
p<=>a
p+1 <=> a+1
p+2 <=> a+2
和
*p<=>*a
*(p+1) <=> *(a+1)
*(p+2) <=> *(a+2)
即
p[0] <=> a[0]
p[1] <=> a[1]
一个对象等价于长度为1的数组,使指针与数组实现了 无缝连接。
const型变量:只读变量,只能初始化,值不能改变。
const int n = 5;
n=6; 非法
const型指针:只读性指针,它指向的变量不能通过它被间接地修改。
const int *p; 或 int const * p;
const int m=5;
int * pm;
pm=&m; 非法
const指针型 形参
函数对该指针指向的变量是只读的,那么就要将该指针声明为const型指针。
int sum(const int * p,int n);
动态数组
int a[5]
或
int a[2+3]
或
int a[] = {0};
int a[n] 非法 变量不能作为 长度
有的数组只要在程序运行期间才能确定其大小,这样的数组需要调用系统的动态函数malloc来生成,称为动态数组。
malloc声明格式 : void * malloc(unsigned size);
形参size的值是生成的空间的字节数,它是无符号的整型,值不等于0,可以是无符号整型变量和表达式。函数返回值是生成空间的首字节指针,指针类型是void *,void表示空类型。
举例说明:如果要生成长度为5的整型数动态数组,那么首先要申请20B的非类型化空间(一个整型4B,共20B)
void * vp = malloc(20);
然后强制类型转换
int * p = (int *)vp;
两步等价于
int * p = (int *)malloc(5*sizeof(int));
如果动态数组空间不再需要,可以使用系统函数free撤销该空间。
free(指针变量名);
指针和左值:
一个函数的返回值不能是自变量的指针,函数返回这个自变量指针式,自变量的生命周期已经结束,它的空间已被撤销,空间的指针已经没有意义。但是函数返回值可以是静态局部变量的指针,而且含有函数调用的表达式可以式左值。
例如:函数调用表达式仁 左值
int *f()
{
static int n = 5;
printf("%d
",n);
return &n; 返回静态局部变量的指针
}
int main()
{
*f() = 100; 表达式*f()间接修改函数f的静态局部变量
f(); 函数f 输出修改后的 静态局部变量的值
return 0;
}
函数指针:与子程序入口地址相当于函数地址,它由函数名表示的函数指针常量,传递函数指针等于传递函数。
函数指针声明格式为:
类型标识符 (*函数指针名)(形参列表);
int (*fp) (int *,int) fp函数指针
int *fp (int *,int) fp是函数名,函数返回值类型是整型指针
第5章 字符串
字符串是有效字符序列,是典型的非数组对象。复合类型。
字符串的存储方式:以字符数组作为存储空间,结尾加结束标识符' ',' '代码是0的空字符,不属于字符串的字符。
标准库string.h 赋值、求串长、串复制、串连接等
字符串常量以 双引号作为界限符 "cha","basizea","39.221"
有效字符个数 称为字符串长度,简称串长 a是转义符,按一个有效字符计算。
char a[8] = "china"; 等价于 char a[8] = {'c','h','i','n','a',' '};
和数组一样,字符串变量在引用时自动转换为首字符指针,称为指针常量,所以它不是左值,例如:
a1 = "china"; 非法 字符串变量不是左值
const型字符指针,合法
const char *p1 = "china";
或
const char *p1;
p1="china";
scanf:读取多个字符串时,分隔符为换行或空格。scanf("%s%s",s,t);
puts(const char *c):显示器输出字符串C,遇到串结束符自动输出换行,成功0,失败-1;
char * gets(char *c):键盘输入一个字符串,按换行符结束,字符串连同换行符输入缓冲区,存入字符串c空间或字符串指针c指向的字符数组,并将换行符'
'转换为' ';返回值是字符串c
第6章 结构体、联合体和枚举
结构体变量名.结构体成员
结构体指针->结构体成员
(*结构体指针).结构体成员
.是成员的引用运算符,->是箭头运算符
struct 结构体 结构体变量名;
typedef 已有的类型名 类型别名;
typedef int INTEGER;
typedef struct Data Date;
struct Student s1 = {1,"张三",90.88};
typedef struct Student SS;
SS s2;
s2 = s1;
s2.id = 2;
strcpy(s2.name,"王五");
s2.score = 88.88;
printf("%d,%s,%.2lf ",s1.id,s1.name,s1.score);
printf("%d,%s,%.2lf ",s2.id,s2.name,s2.score);
结构体中字符串成员,不能直接用 = 赋值。
SS *sp3 = &s2; /* 结构体指针变量 */
printf("
");
printf("%d",sp3->id);
printf("%s",sp3->name);
enum 枚举类型名 {枚举常量1,枚举常量2...n-1}
第9章 流与文件
数据常常从一个位置流向另一个位置,这种数据的流动称为数据流,简称流。
每一个具体的数据流总是和某一个设备或外部介质有关。键盘输入,显示屏输出,这种与数据流有关的设备和介质统称为文件。
每一个文件对应一个文件指针,键盘对应stdin、显示器stdout、打印机sprn。
数据流通过文件指针与具体的设备和介质相连。
一个字符对应一个ASCII码,每一个ASCII码占1B 。
每一次对磁盘的读写都要移动磁头,以寻找磁道的扇区。
下一篇:C指针纳 威恩 学习笔记