C程序设计总结(第五版-谭浩强)
第一章-程序设计和C语言
1.程序:一组计算机能够识别和执行的指令。
2.指令:使计算机执行特定的操作,如加法指令使计算机执行一次加法运算。
3.计算机语言:计算机和人都能识别的语言,作为沟通的桥梁。
4.计算机语言的分类:
低级语言、高级语言(面向过程的语言、面向对象的语言)
低级语言与高级语言的区别:低级语言更加贴近计算机,也就是用0和1表示为主。高级语言则更接近人们习惯,如直接用英文表示。
面向过程与面向对象的区别:面向过程更注重实现过程中的细节,而面向对象更注重实现过程的对象,如对象的属性和方法。
源程序:是编写好的算法,保存后的文件。目标程序:是编译后的文件。可执行文件:当目标程序加上库函数时就成了可执行文件,也就是可以运行的出结果的文件。
第二章-算法
- 程序=算法+数据结构
- 数据结构:对数据的描述。也就是在程序中要指定用到的数据,以及数据的类型和数据的组织形式。
- 算法:对操作的描述。描述计算机进行的操作步骤。
算法的五大特性:有穷性、有效性、确定性、输入、输出
算法的四大表示方法:自然语言、流程图、结构化流程图、伪代码、
结构化程序设计的方法:自顶向下、逐步细化、模块化设计、结构化编程
三种基本结构:顺序结构、选择结构、循环结构
第三章-循序程序设计
标识符:标识符即为一个对象的名字。只能由字母、数字、下划线中一种或多种组合而成,且第一个字符必须为字母或下划线。
基本数据类型:整型类型(int、char、bool)、浮点类型(float、double)
派生类型:指针、数组、结构体、函数
补码的求法:正数直接用二进制数表示;负数则取反加一。
5的补码:
0000000000000101
-5的补码:
1111111111111010(取反)
1111111111111011(加一)
i++与++i的区别;i++先使用原值i进行操作,再对i+1,而++i直接对i+1,再参与运算。
#include <stdio.h> int main() { int i = 0; printf("%d\n", i++); }
运行结果为0
#include <stdio.h> int main() { int i = 0; printf("%d\n", ++i); }
运行结果为1
低精度自动向高精度转化:使用(int)x可将x转化为int类型。
getchar接收字符,putchar输出字符。
#include <stdio.h> int main() { char x, y, z; x = getchar(); y = getchar(); z = getchar(); putchar(x); putchar(y); putchar(z); return 0; }
第四章-选择结构程序
选择语法:if语句与switch语句。
两者区别:if可以用于处理复杂的判断条件,if语句的括号内支持复杂的表达式;switch语句则适用于单个变量的多分支选择,且变量的类型必须是整型类型.
双目运算符与单目运算符的区别:
双目运算符序号两个操作对象来参与运算;单目运算符只需要有一个操作对象参与运算,如:!(x>y)。
三目运算符:
表达式1
?表达式2
:表达式3
作用相当于一个简化的if() {} else {} 语句
如判断两个整型数字中谁最大
#include <stdio.h> int main() { int x, y, z; scanf("%d, %d", &x, &y); z = (x>y)?x:y; printf("the max number is %d", z); return 0; }
第五章-循环结构程序设计
为何需要循环结构?
有了顺序结构和选择结构能够满足日常的程序设计,但是会存在很多重复的处理流程。如:输出全班所有同学的名字,为了避免多次重复的输出代码的编写,使用循环结构可以方便的进行重复操作,简化了代码的同时方便了设计,避免了代码的冗余。
常见的循环结构有哪些
while循环、for循环。两者可互相转化。
break与continue的区别
break语句只能放在循环语句和switch语句中,不能单独使用,break的作用是结束循环。
continue语句则是结束本次循环,接着执行下层循环。
第六章-数组
为何需要数组?
为了解决变量过多而造成的繁琐,同时彰显其内在的联系(相同数据类型的集合)。
数组的基本特征是什么?
数组是一组相同数据类型的集合
如何定义数组
一维数组:数组类型 数组变量[数组大小];例如:int a[10];
第七章-函数
为何使用函数?
实现模块化编程,便于维护和后续开发。
一个C程序由一个或多个程序模块组成,每个程序模块都作为一个源程序文件。
如何实现函数?
声明、定义、调用。
函数的种类:库函数与用户自定义的函数
局部变量与全局变量
两者作用域不同,一个作用局部,一个作用全局。
动态存储方式与静态存储方式
静态存储方式:指程序运行期间由程序分配固定的存储空间存储,容易造成浪费。
动态存储方式:在程序运行期间根据需要进行动态的分配存储空间,节约空间。
自动变量(auto)、静态局部变量(static)、寄存器变量(register)这3种局部变量为何?主要区别?
存储地址不同
自动变量存储在动态存储区
静态局部变量存储在静态存储区
寄存器存储在cpu中的寄存器中
第八章-指针
何为指针?
指针即地址。
地址的定义:系统根据定义的变量类型,分配一定的长度空间,内存区的每一个字节都有一个编号,这就是地址。通过地址能够找到所需要的变量单元,可以说,指针指向该变量单元,将地址形象化地称之为指针。C语言中的地址包括位置信息和它所指向的数据类型信息。
何为指针变量?
存放地址的变量是指针变量,它用来指向另一个对象
何为空指针?
指指针变量的值是不确定的或都是无效的,这种指针叫野指针。
使用野指针不一定会出现问题,但是可能会出现一下问题:
- 一切正常
- 段错误
- 脏数据
数组与指针有什么关系?
数组名就是一个指针(常指针)
数组名与数组首地址是映射关系*p=arr是指向关系(&*p是有一个地址的)
由于数组名就是指针,所以数组名可以使用指针的解引用运算符,而指针可以使用数组。
第九章-用户建立自己的数据类型
为何需要自己定义数据类型?
一方面由于常见的数据变量之间存在相互的联系,如:学生的学号与姓名之间存在联系。
那为何不采用数组将其存储在一起,使其相互联系?
数组只能存放类型相同的变量,例如全部存放int型的数据,或者全部存放char型的数据,不可以随意存储。而自己建立的数据类型就可以避免此问题,可以存放不同类型的数据。
如何定义?
struct student { int number; char name[20]; char sex; };