明解c语言(读书笔记)

这篇博客详细介绍了C语言的基础知识,包括源程序、翻译过程、注释、变量、运算符和数据类型。深入讲解了分支结构(如if、switch)、循环控制(如for、while、do-while)以及数组、函数、指针、字符串、结构体和文件处理的基本概念和使用方法。适合初学者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一章 初识c语言

源程序:由人编写出的字符序列。
源文件:保存源程序的文件,以.c保存
翻译:将源程序转化为可执行序列,编译器和运行环境不同时,翻译的步骤和程序执行的方法也不同。
注释://之间是注释
格式化输出函数:printf(f是format的缩写)printf("%d",a),%f 显示浮点数
变量:声明、赋值
格式化输入函数:scanf,scanf("%d",&a)
顺序输出字符串函数:puts(s取自字符串)
分号相当于句号,表示一句话的结束,语句必须以分号结尾;

第二章 运算和数据类型

当只想输出%的时候,写为%%
表达式语句:由表达式和分号组成的语句,表达式:由变量、常量、和运算符组成的式子。
类型转换运算符:(类型名)a
语句:要以 ; 结尾

第三章 分支结构程序

条件运算符:a?b:c,如果a不为0,输出b,否则,输出c
复合语句:{ 声明;语句};复合语句也被看作单一语句
在单一语句的地方要使用多个语句时,要组合成复合语句。如 if 语句;if 语句 else 语句;此语句出若想使用多个语句,需要使用复合语句。
switch case; break; default;常用于单一表达式判断控制程序流程分支
if语句: if (表达式) 语句
if (表达式) 语句 else 语句
switch语句:switch (表达式) 语句
break语句:break ;
标签:用于程序跳转的标识,如 case default

第四章 程序的循环控制

do语句:do 语句 while (表达式) ;
初始化:声明+赋值
while语句:while (表达式) 语句
a–:使a的值减少1,该表达式的值是a未减去1时的值。
–a:使a的值减少1,该表达式的值是a减去1时的值。
for语句:for (表达式1 ;表达式2 ;表达式3 ;)语句 (预处理 ;控制表达式 ;收尾处理)

第五章 数组

数组:相同类型的数据有序的组织起来,数组声明时元素个数必须为常数。(可以用定义宏的形式来支持)
c语言不支持数组之间相互赋值,不能利用赋值语句直接对数组赋值
对象式宏:#define
unsigned long 类型:%lu
质数:无法被小于它的平方根的数整除的数。
逗号运算符:a,b 依次对表达式进行运算,把最后的值当作整个表达式的结果。a的值也会被保留。

第六章 函数

不同的编译器提供不同的函数。
函数头:由返回类型来决定、没有返回值的函数,函数头为void
函数体:被{}括起来的语句。
值传递:通过值来进行参数传递
函数与函数之间分别实现,在主函数内里实现对各个函数的调用。在主程序进行调用时,子程序必须已经被声明。(声明返回值类型和形式参数)。所以一般把main函数放在最后。
定义声明:创建变量实体的声明
非定义声明:使用extern,使用其他处定义的变量
#include<stdio.h>:库函数printf和puts的函数原型声明都在<stdio.h>里面。通过#include(文件包含指令)指令,将包括库函数的<stdio.h>(头文件)全部读取到程序中。不同的编译器实现头文件的方法也不同。
数组调用:在函数中调用数组时,实参名以数组名代替即可。形参中接收数组需要加上[]来表示,在形参名前加上const,这样接受到的数组内容就不会被函数所改变。(编译时会发生错误)。
哨兵:在数组末尾添加数据;利用:哨兵查找法
自动存储期:不加标记或者被auto、register标记的变量;在各自声明的函数结束后被释放。
静态存储期:被static标记的变量,存活到main函数结束(虽然会再次经过 static int a=b,但是已经经过初始化的a不会被执行初始化语句。)
在主函数里声明的未赋值的数会因为编辑器的不同而自动分配值,其他未赋值的会被赋予0.

第七章 基本数据类型

补码:表示的负数比正数多一位
补码:表示的负数正数一样多
<limits.h>:以宏定义的形式定义了各个数据类型的最大值和最小值。
typedef:声明数据类型;typedef unsigned size_t 将size_t等同于了unsigned
格式字符串的转换说明必须要与要显示的数值类型保持相一致。
逻辑运算符:&& | | !; 非0为真,0为假(结果只有0和1)
按位逻辑运算符:& | ! ;1为真 0为假(结果可能还有别的)
位移运算符:通常不对负数做,防止出错
<float.h>:定义浮点型的特性
循环判断基准的变量应使用整数而不是浮点数,计算机不能保证内部浮点数的二进制转换不会丢失。(当用到小数时,先用整数做判断,再除以相应的倍数)
<math.h>:基本数学函数的函数声明
结合性:双目运算符(左结合);赋值运算符(右结合)
sizeof (数据类型名称):判断数据类型长度
数组元素的个数:sizeof(vc)/sizeof(vc[0])

第八章 程序编写

函数式宏:较之对象式宏可以进行更复杂的代码替换。(否则,针对同一个函数,要对整型和浮点型数据进行不同的编写处理),在宏函数被调用时是被直接填写在调用的地方,因此有可能会产生运算优先级的错误,因此建议在定义的时候将函数加上括号。
函数式宏的副作用:((a++)*(a++)) a会被自加两次。
若宏定义中要替代两个及以上的表达式,要使用逗号分隔开,
逗号(,)分隔符:将两个表达式视为一个表达式。
枚举类型的定义:变量名(enum) 枚举名 {枚举常量}
枚举类型的调用:enum animal (数据类型) 变量名
枚举常量:默认从0开始依次增加被赋值
能用枚举类型表示的数据类型,应尽量使用枚举类型表示。(枚举相当于对象式宏的简写)getchar:逐个读取并返回输入的字符,结束值为EOF.
putchar:输出单个字符

第九章 字符串基本知识

字符串字面量:被双引号包起来的一系列字符,且在字符的末尾有个null字符\0;具有静态生命周期
字符串:以字符数组的形式存在,末尾是首次出现的null字符;转换说明是%s,以char来声明,字符数组传入scanf函数时不用加&符。
字符串数组:以二维数组的方式来实现,a[] [] 只要第一维的数组元素数可以省略。

第十章 指针

main函数调用子函数时,将实参赋予给虚参,是值传递,单向传递。
变量:保存数值的盒子
地址:对象在内存中的位置,对象的地址是指对象在内存中的存储位置编号
&:取址运算符,放在对象前面,获取对象的地址。(生成指向a的指针);对象地址的转换说明,%p
变量名前带有*: 指向该变量 (如int)类型变量的指针变量,指向(int)型对象。
int型变量:保存“整数”的盒子
指向int型变量的指针变量:保存“存放整数对象的地址“的盒子
指向:当指针ptr的值为对象x的地址时,通常说ptr指向x,此时,*ptr是x的别名。
指针运算符( ):写于指针变量之前,显示该指针指向对象的内容。
作为函数参数的指针:通过指针来实现子函数修改可以传递到main函数这一目的。(即如果想要在函数中修改变量的值,需要传入指向该变量的值)
引用传递(C++):使主调函数与被调函数通过参数紧密地连接在了一起,”模块独立性被降低。
scanf函数与指针:接收到的是指针(具有地址的“值”)
指针和数组:指针ptr指向数组的第一个元素;
(ptr+i)可以写做ptr[i]
程序中不带有下标[]而出现的数组名,会被视为指向该数组第一个元素的指针。即vc=&vc[0]

第十一章 字符和指针

数组元素储存的字符串是以连续内存单元存储的,而指针只是指向第一个数组元素的地址。
“用指针实现的字符串”的数组:*ptr[3]

第十二章 结构体

结构体:struct 结构名 {结构体成员} ;(结构体的声明)
结构体的使用:struct 结构名 (结构体类型)
结构体成员:(.运算符)
指向结构体的指针->成员名:std->height
->运算符:用指针访问结构体a中的成员b,a->b
<time.h>:求出日期时间,
作为成员的结构体:结构体的成员包括但不限于 数组,结构体,int, double

第十三章 文件处理

文件:程序运行结束后仍需保存数据和字符串等数据保存的地方。
流:流淌着字符的河,
标准流:stdin(标准输入流) stdout(标准输出流) stderr (标准错误流),
FILE型:标准流都是指向FILE型的指针型,FILE型是在<stdio.h>中定义的。用于记录控制流所需要的信息,包括文件位置指示符,错误指示符,文件结束指示符
文件类型:二进制文件,文本文件。
fopen函数:配合FILE * 型指针对流操作。1、fopen函数创建一个新的流,然后返回一个指向FILE型对象的指针,该FILE型包含了控制这个流所需要的信息。FILE * op; op=fopen(“abc”,“r”)
fclose函数:fclose(fp)
fscanf:文件读取函数,fscanf(fp,"%d",x),类似于scanf,只是多了一个输入流。
fprintf:文件写入函数,fprintf(fp,"%d",x),类似于printf,只是多了一个输入流。
fgetc:显示文件内容,fgetc(fp),类似于getchar.
fputc:复制到文件,fput(c,fp),类似于putchar.
与之前的区别,之前是到标准输入输出流,现在是对文件的操作。
文本文件:数据以字符序列的形式表示,因此文本文件的字符数取决于数值位数。
二进制文件:数据以二进制位串的形式出现,字符数不依赖于数值位数。
在二进制文件中保存实数:fwrite、fread
fwrite/fopen(&pi,sizeof(double),1,fp):四个参数。1.读写数据的首地址的指针。2.数据的长度。3.数据的个数。4. 数据流(对二进制文件的处理)
显示文件自身:若是对二进制文件采用文件显示的话,会显示错误二进制码(因为其不可打印)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值