1、1/83郝斌 C 语言自学视频 笔记 v1.1作者:星辰变 71目录的编号对应视频的编号,专为懒得打字做笔记的吧友所著!再次感谢郝斌老师,带我们装逼带我们飞 (_)目录1.所用编程软件 .317.什么是数据类型 .318.什么是变量 .320.变量为什么必须初始化 .421.如何定义变量 .422.什么是进制 .423.常量在 C 语言中是如何表示的 .424.常量是以什么样的二进制代码存储在计算机中 .526.代码的规范化 .627.什么是字节 .628.不同类型数据之间相互赋值的问题 .629Char 使用常见问题 .630.什么是 ASCII 码 733.printf() ;将变量的内容
2、输出到显示器上 734.如何让程序更有保存价值 .8补充:怎么复制.exe 黑窗口中的数据 836.为什么需要输出控制符 .938+39.scanf() ;用法:通过键盘将数据输入到变量中 .940.一次给多个键盘变量赋值 .1041.第一部分:如何优雅地使用 scanf .1141.第二部分:保证前面输入的垃圾值不会被接受 .1342.运算符的分类 .1343.除法与取余 .1344.逻辑运算符 .1445.初学者学习运算符的一些建议。 .1446.黑窗口不要重复打开和其属性修改 .1652.if 最简单用法 .1653.if 的范围 .1654.ifelse的用法 1755-1.ifels
3、e ifelse的用法 .172/8355-2. if 中容易犯的错误 1857.if 举例 求分数的等级 .1958. if 举例 互换两个数据 2059.对任意三个数字进行排序 .2060.如何看懂一个程序 .2162.if 空语句的问题 .2163.if 常见问题 .2267.初识 for 循环 2468.for 最简单的应用- 求 10 以内奇数和 2569.for 和 if 的嵌套使用 .2571.强制类型转换 .2672.浮点数存储带来的问题 .2873.for 和 if 的嵌套循环 .29补充:软件自动对齐的方法 3074.多个 for 循环的嵌套 3075.复习进制的知识 .3
4、176.运算符补充 自增/自减 .3177.运算符补充 三目运算符 .3278.运算符补充 逗号表达式 .3282.while 循环 .3383.for 和 while 的比较 3387.何时用 while,何时用 for 3488.dowhile 3490.switch 用法简介 .3691.switch 琐碎知识 .3892.break 的用法 tinue 的用法 3998.数组的简单使用 .4299.为什么需要数组 .42101.一维数组 42102.二维数组 44103.是否存在多维数组 .45106-107.为什么需要函数+ 什么是函数 45108.如何定义函数? .46109.re
5、turn 和 break 的区别 47110.函数的分类. 49111.函数举例 49113.函数的声明. 523/83114.函数的形参和实参 .53115.如何在软件开发中合理的设计函数来解决实际问题 .53120.函数的作用域和存储方式 .53121.指针初次介绍 .54122.指针的重要性 .54123.什么是地址. 54124.什么是指针. 54125.基本类型的指针 .54126. 基本类型的指针常见错误解析 .55127.经典指针程序-互换两个数字 57129.实参和形参永远是不同的变量 .59130.指针可以使被调函数修改主调函数多个变量的值 .60131-136.专题:一维数
6、组和指针关系 60137.何为变量地址?一个指针变量占几个字节 难点 .63补充:字符数组和字符串,视频没讲 64补充:通过指针引用字符串 65138-150.专题:动态内存分配重点难点 .66151-164.结构体 .70163.冒泡排序 77168-170.补码 .79176.位运算符(重点!) .81179.NULL 的含义 .821.所用编程软件视频中用的编程软件是 VC+6.0,本笔记用的编程软件是 VS2010 和 Dev C+5.11。要求变量定义写在最前面,不能中途定义,否则编译时会出错。17.什么是数据类型整型:整型 int-4 字节 长整型 long int-8 短整型 s
7、hort int-2浮点型:float-4 double-8字符 char-1所占字节数不一定都是这样,但是比如长整型所占一定大于等于整型。复合数据类型:结构体 枚举 共用体18.什么是变量int i; /VC+6.0 请求操作系统把内存条中的一个空闲单元和 i 产生关联i=3; /3 最终是存放在内存中,程序终止之后 3 所站的空间被释放4/83如果不使用变量,要自己去找内存中的空闲单元,有了变量就不用考虑了。变量的本质就是内存中一段存储空间20.变量为什么必须初始化所谓初始化,就是赋值。当软件运行完毕后,操作系统将回收该内存空间,以便再次分配给其他软件使用。 (注意:操作系统并不清空该内存
8、空间中遗留下来的数据)综上,一个软件所分配的空间中极可能存在着以前其他软件使用过后的残留数据(垃圾数据) 。所以通常我们为一个变量,为一个数组,分配好存储空间之后都要对该内存空间初始化!21.如何定义变量int i=3;等价于 int i; i=3;int i,j;等价于 int i; int j;int i,j=3;等价于 int i; int j; j=3;int j=3,j=5;等价于 int i; int j; i=3; j=5;int i,j;i=j=5;等价于 int i,j; i=5; j=5;22.什么是进制N 进制就是指逢 N 进 1。我们计算机只识别二进制。 C 语言规定八
9、进制前要加 0(注意是零不是字母 O) ,十六进制前要加 0x 或者 0X,十进制前什么都不加。在汇编中:在数字后加字母 B 表示二进制,加 O 表示八进制,加 D 表示十进制,加 H 表示十六进制。例如:1011B 也记为(1011) 21357O 也记为( 1357) 82049D 也记为(2049) 103FB9H 也记为(3FB9) 16printf 中,%d 表示以十进制输出;%x 或%X(决定输出字母的大小写)以十六进制输出;%O(这次是字母不是零了!)表示以八进制输出。23.常量在 C 语言中是如何表示的A整数:八进制前要加 0(注意是零不是字母 O) ,十六进制前要加 0x 或
10、者0X,十进制前什么都不加。B浮点数:传统的写法 float = 3.2;科学计数法 float x = 3.2e3; /x 的值是 3200float x =123.45e-2; /x 的值是是 1.23455/83编译时会有个警告,如图为什么呢?C 语言中,无论是传统写法还是科学计数法,默认是 double 型。double 赋给 float 会丢失精度。可以选择忽略警告,也可以选择加个 F 变成123.45e-2F。这样编译时就没有警告了。注意一个问题,为了解决上述窗口一闪而过,我们要加上头文件(如图)并在main 函数结尾前加上(如图) 。C字符:单个字符用单引号括起来,如A。 AB错
11、误, ”AB”正确。字符串用双引号括起来。 A正确,因为A代表了A 0的组合。可以想成一个字符串就一个字符。24.常量是以什么样的二进制代码存储在计算机中整数是以补码的形式转换为二进制代码存储在计算中的。实数是以 IEEE754 标准转换为二进制代码存储在计算中的。6/83字符本质上与整数的存储方式相同。26.代码的规范化A. 括号一敲敲一对(),敲完括号再写内容B注意加空格。比如 if ()/if 要敲空格再加括号比如 Int a = 1; /等号两边要加空格比如 x1 = (-b + sqrt(delta) / (2*a); /这些运算之间要加空格C注意从属关系要进行缩进。选中要缩进的多行
12、代码按 Tab,就一起右移了,Shift+Tab 就一起左移回来了。D代码之间要适当的空行。相同功能的写在一起,然后空一行再写下一部分相对独立功能的代码。27.什么是字节字节是存储数据的单位,并且是硬件所能访问的最小单位。1 字节=8 位,这是固定不变的。CPU 只能直接处理内存里面的数据,硬盘的数据必须调入内存才能处理。硬件上最小的单位是位,不是 0 就是 1。但是 CPU 只能到字节上,不能准确控制到某一位。控制到位上可通过位运算符。下面是内存条28.不同类型数据之间相互赋值的问题这个问题是 C 和 C+所独有的,如果想深入了解 C 和 C+必须搞清楚。如果想搞清楚必须懂补码。29Char
13、 使用常见问题A. char ch = A; /正确char ch =”AB”; /错误,不能把字符串赋给单个字符char ch =”A” ; /错误char ch =AB; /错误B以下写法是错误的!7/83下面这么写就对了。30.什么是 ASCII 码ASCII 不是一个值,是一种规定。它规定不同的字符是使用哪个整数值去表示。比如A-65 /A 这个字符在 ASCII 中是用 65 来表示的a-97, 0-48所以说字符本质上与整数的存储方式相同。33.printf();将变量的内容输出到显示器上四种用法:A.printf(” 字符串” ) ;B.printf(” 输出控制符”,输出参数)
14、 ;8/83C.printf(”输出控制符 1 输出控制符 2”,输出参数 1,输出参数 2) ;要是想让 35 之间有空格要是想让 35 之间有逗号还有更清楚的,写上 i = 3,j = 5 如下图注意一个问题,下面写法是错误的,虽然编译时没有问题。因为输出控制符和输出参数的个数不一一对应。D. printf(”输出控制符 非输出控制符”,输出参数) ;输出控制符包括%d %ld %c %f %lf %o %s %x(或%X 或%#X 或%#x)这么看还是%#X 比较好!非输出控制符原样输出,在上面 C 中就是例子。34.如何让程序更有保存价值在开头加上时间,功能,目的等。在末尾加上在某款软
15、件中的输出结果和总结。补充:怎么复制.exe 黑窗口中的数据右键标记或者全选,标记完了再点右键,然后就不是被选中状态了。这时到目标处 ctrl+V 就 OK 了。9/8336.为什么需要输出控制符A.0 和 1 组成的代码可以表示数据也可以表示指令。一串 01 代码本身没有实际含义,关键是看怎么用输出控制符去解读。B. 0 和 1 组成的代码表示的是数据的话,那么用不同的输出格式输出就会有不同的结果。38+39.scanf();用法:通过键盘将数据输入到变量中scanf(” 输入控制符 ”,输入参数) ;/当然可以含有非输入控制符功能:将从键盘输入的字符,转化为输入控制符所规定格式的数据,然后
16、存入以输入参数的值为地址的变量中。解析:A.读着云里雾里。在键盘输入 123 不是整型数字 123,而是字符 1 字符 2 字符3,操作系统就是这么规定的。%d 的作用就是把字符 1 字符 2 字符 3 转换成一个十进制整数。B.输入参数是 / n 加进来后你想输出 123 就要输入 123n总结:一个取地址符 然后 scanf 和 printf 都用%c 那就 i = 123,j = m,当然这也是错误的输入方式。然后还有一个问题,我要是输入 123mn 呢?j = mn?别忘了 char 只能存放一个字符啊!所以只能放 m 啊!C-2. 如果输入 m123,开始读就错了,往后都错了,如下图
17、。12/83注意啊,这个地方要好好的理解一下啊!上面的例子是说输入错误的情况下是输一次值回车就报错了。因为出错的部分不会自动丢弃,等待下一次输入时再把出错的部分赋给下一个变量!直接就不用你给下一个变量输入了!然后往后就全错了!好贱啊!上句话不理解可以看 C-6,C-7 。C-3. 我再次输错值,我输入 123 空格 456还是一次输入,按回车就这个结果。C-4. 我要是输入 123 空格 456 空格 789,结果如图。个人猜测应该是检测到 123 遇到空格就把 123 给 i,但是空格不影响往下检测,检测到 456 遇到空格就把 456 给了 j,再没有输入的值了就停了。C-5. 我要是输入
18、 123(可以加一堆空格) ,他会继续光标闪烁提醒我输入第二个值,我输入 456(可以加一堆空格)再按回车结果如下C-6. 正确的输入方式也就是按照流程的意思就是 C-5 中输入 123 回车输入 456回车。所以编写程序时可以按照下图,这样就引导用户按照正确的输入方式输入。13/83C-7. 按照上面的引导出错的话,结果如下图。41.第二部分:保证前面输入的垃圾值不会被接受这样就出现一个问题,当我需要对变量键盘赋值时,前面的输入可能会遗留一些垃圾的输入值,就像上面例子以前有些值没有放进去,而是放进这次输入了,然后往后就全错了。真不知道为什么设计者不直接自动丢弃错误部分呢?!所以我们需要这样一
19、个功能,输入值时要保证前面输入的垃圾值不会被接收。两个 scanf 之间加入两行代码while( ch = getchar() )!= n)continue;如图,这样在输入时前面输入的垃圾值就没有影响了,好神奇啊(_)ch 是 char 类型的!另外很多编好的代码拿过来就能用,不必自己再绞尽脑汁的去想!42.运算符的分类算数运算符:+ - * /(除) %(取余)关系运算符: = 关系逻辑赋值43.除法与取余除法/的运算结果和运算对象的数据类型有关,两个都是 int,则商就是 int,若14/83商有小数,则去除小数部分;被除数和除数中有一个或两个是浮点型,那结果就是浮点型,不去除小数部分。
20、如 16/5=3 16/5.0=3.2 -13/4=-3 -13/-3=4 3/5=0 有一个常用的计算:m = 1234; m /= 10;第 1 次 m = 123 第 2 次 m = 12 第 3 次 m = 1 第 4 次 m = 0取余%的运算对象必须是整数,结果是整除后的余数,余数的符号与被除数相同。13%3=1 13%-3=1 -13%3=-1 -13%-3=-1 3%5=3 44.逻辑运算符 else if (2)B;else if (3)C;else /注意!最后一个 else 后面没有括号了!D;说明:(1)成立 A 执行;如果( 1)不成立(2)成立 B 执行;如果(1) (2)都不成立执行 C;(1 ) (2) (3 )都不成立就执行 D 了。注意啊!有个容易犯的错误用法!19/8355-2. if 中容易犯的错误这是 1 个语句,不是 3 个!要是 3 个都会执行那是3 个语句,可是只会执行一个所以是 1 个语句。下面的写法就是错误的!加了哈哈这个语句之后把这个整体分成了 3 个语句,语句 1 没问题,语句 2 也没问题,但是语句 3 就错了!因为没有语句以 else 开头()当然,编译(Ctrl + F7)时会提示错误:57.if 举例 求分数的等级注意:一种错误的表达式写法!90 = 90 2; 3)