C语言基础学习知识梳理

C语言作为一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点,因此他的应用范围也是十分的广。学习完C语言后,对他的强大功能也是感受颇深,下面呢是我学完C语言后做的一点总结也是对C知识的梳理。

根据学习的过程,将C语言学习分成几个大的模块:关键字与标识符、数据类型、输入/输出、运算符、选择结构、循环结构、函数、全局变量、数组、指针、构造类型等。

1、关键字与标识符

1.1 关键字

关键字:在规范C语言时,用于表示一定的特殊含义的字符,只要在C程序中使用,就代表了一定的操作和含义,约定的具有特定功能的单词或字符。在C语言程序中,我们所定义的名字不能和关键字重名。

1.2 标识符

标识符在当前程序中设定的一些字符符号表示,表示一定的意义,代表一个定义的作用(即们自己所定义的字符符号含义)。

标识符的表示:

由字母数字和下划线构成,且只能以字母或 下划线开始

合法标识符:abc,a1,a2,o_k

非法标识符:%abc,a$b,1a

2、数据类型

在C语言程序中,数据值都有对应的数据类型。这里主要写基本类型,其他的在后面会详细描述。

2.1 整型

整数存储以二进制,补码形式存储

整型:根据在计算机中设定的大小

short (int):短整型------16位二进制(16bit)

int:整型-------------32位(32bit)

long (int):长整型-------在32位系统大小为 32位(32bit);在64位系统大小为 64位(64bit)

long long (int):超长整型----64位(64bit)

signed:有符号数,最高位为 符号位

unsigned:无符号数,没有符号位

整型数,例:10、-10、1

2.2 浮点型(实型)

浮点型存储以二进制,补码形式存储

数据部分 + 指数部分

浮点型:设定类型大小

float:单精度浮点型---32位(32bit)

double:双精度浮点型-----64位(64bit)

浮点数,例:1.2、3.1415、-1.5

2.3 字符型

对于字符型数据,在计算机中存储,依旧使用二进制 0 和 1表示。对于每个字符统一用一种标准的二进制来表示,在C语言中,使用 ASCII码来表示(小整数)

字符类型:

char:字符类型--------8位(8bit)

字符类型可以当做整数进行操作:char 可以表示为 只有8位的整数

3、输入/输出

3.1 输出

printf:由C语言标准所设计的输出功能,只要使用printf就可以实现输出打印(终端)。printf功能要使用的话需要引入stdio.h库,即#include。

格式:

printf("要输出打印的内容   格式化字符1,格式化字符2 ", 输出列表);

格式化字符:作用就是占位表示要打印对应的数据值,以% 表示。

输出列表:格式化字符要打印的数据。

常用的格式化字符:

%d:以带符号的十进制形式输出整数。

%f:以定点十进制小数形式输出浮点数。

%c:以字符形式输出,只输出一个字符。

%s:以字符串形式输出。

格式化字符输出指定的位数:

%m.p 格式字符:m 数据的宽度,p小数的精度

在输出中,如果要输出某些特殊字符,在字符编码上没有对应的字符表示,在C语言中,设计转义字符:把普通字符转义为特殊字符,特殊字符转义为普通字符:

转义字符:“ \”、回车换行“\n”、反斜线字符“\\”、续行符“\:”。

3.2 输入

scanf:输入功能,可以从键盘输入数据给变量

使用scanf 也是必须包含对应的头文件  #include

格式:

scanf("键盘输入匹配,格式化字符1,格式化字符2,",输入列表);

格式化字符:格式化字符位置匹配的内容输入到变量中

输入列表:列出要输入的变量

注意:如果是连续两个数值格式化字符,在键盘输入时需要隔开(空格、回车)。

4、运算符

4.1 算术运算符

加法(+)、减法(-)、乘法(*)、除法(/ 取整)、取余数(%).

例:3/2=1、3%2=2

4.2 关系运算符

 小于()、等于(==)、不等于(!=)、大于等于(>=)、小于等于(

关系运算符是进行比较运算,判断关系是否成立(比较左右两边的表达式是否满足关系),比较结果:成立为真(值:1),不成立为假(值:0)。

注意:在进行运算时,如果有连续的多个运算符,单一运算符进行运算之后得到结果再与下一个运算符进行运算。

4.3 逻辑运算符

连接表达式,根据表达式的真 假,进行组合得到新的结果,结果也是真(值:1) 假(值:0)

逻辑运算表示两个数据或表达式之间的逻辑关系,逻辑运算的结果也只有两个:真为1和假为0。

&& (与):

表达式1  &&  表达式2

如果表达式1为真,且表达式2为真,逻辑与 结果 为真(值:1),否则 逻辑与 结果为假(只要有一个表达式为假,结果为假)(值:0)------判断,表达式1 和表达式2 是否同时成立为真

截断原则:当表达式1 已经为 假(0),不会运算 表达式2

|| (或):

表达式1 ||  表达式2

如果表达式1和表达式2 都为 假,逻辑或 结果为 假(值:0),否则 逻辑或为真(只有有一个表达式为真,结果为真)(值:1)-----判断,表达式1和表达式2 是否同时都不成立为假(是否存在表达式为真)

截断原则:当表达式1 已经为 真(1),不会运算 表达式2

! (非):

!表达式

改变表达式的真假结果,如表达式为假,逻辑非结果为 真(值:1),如表达式为真,逻辑非 结果为 假(值:0)。

4.4 位运算符

位运算对数据中的对应的二进制位进行运算操作(不会涉及到符号位说法)

&(位与)

表达式/数1 &  表达式/数2

把数1的二进制 与 数2的二进制,对应的每一位进行与运算操作(两个数对应的位有0,为0,都为1,则为1,位运算规则为:1 &1 = 1       0 & 1 = 0       1 & 0 = 0      0 & 0 = 0)。

|(位或)

表达式/数1 |  表达式/数2

将两个运算量的各个相应位分别进行“或”运算操作(两个数对应的位,有1,为1,都为0,则为0,运算规则为:1 | 1 = 1      0 | 1 = 1       1 | 0 = 1       0 | 0 = 0)。

^(位异或)

表达式/数1 ^  表达式/数2

将两个运算量的各个相应位分别进行“异或”运算(两个数对应的位,相同为0,不同为1,运算规则为:1 ^ 1 =0       0 ^ 1 = 1       1 ^ 0 = 1       0 ^ 0 = 0)。

~(位取反)

~数

将一个数据中所有位都取其相反值,即1变0,0变1,运算规则为:     ~1  -->  0        ~0   -->   1。

数据值

将一个数据所有二进制位向左移若干位,左边(高位)移出的部分舍去,右边(低位)自动补零。

>>(按位右移)

数据值

将一个数据所有二进制位向右移若干位,右边(低位)移除的部分舍去,左边(高位)根据原最高位自动补值(原最高位为1:补1,元最高位为0,补0)。

4.5 复合运算符

 复合运算符:可以使用 = (赋值运算符)和 其他的运算符(算数运算符,位运算符)结合使用。

+=、-=、*=、/=、%=、|= 、&=、^=

变量  +=  表达式======> 变量 = 变量 + (表达式)

4.6 其他运算符

4.6.1 自增自减运算符

++ 、 --

变量++:先取变量的值,进行其他运算,然后变量 +1 ,使用变量时,使用+1之前的值

变量;

变量 += 1;

++变量:先把变量+1,然后取变量的值,进行其他运算

变量 += 1;

变量;

变量--

--变量

前缀:先自增自减后再参与表达式运算。

后缀:先参与表达式运算,后自增自减。

4.6.2 条件运算符(三元运算符)

运算符----   ?  :

条件表达式:

表达式1 ? 表达式2 : 表达式3

表达式1为真,执行表达式2,把表达式2的结果作为整个条件表达式的结果为假,执行表达式3,把表达式3的结果作为整个表达式的结果。

4.6.3 逗号运算符

逗号运算符

表达式1,表达式2,…,表达式n

依次运算操作每个表达式,把最后一个表达式运算作为整个逗号运算符的结果。

4.6.4 sizeof运算符

sizeof(数值/类型):作用 计算数据 对应类型的大小,以字节表示

sizeof 运算符,计算类型、变量或表达式的空间大小(字节数)

sizeof(变量);

sizeof(表达式);

sizeof(类型);

5、选择结构

5.1 if...else选择结构

5.1.1 单分支选择结构

根据条件,如果满足条件 则 执行对应的功能操作代码,执行完后,然后继续往下执行;否则跳过对应的功能代码,继续往下执行。

if(条件表达式)

{

语句块;

}

{}花括号满足if选择的范围语句块,如果语句块只有 一条 语句,则{}可省略。

条件表达式:只计算表达式的结果为 真(非0) 或 假(0)

如果满足条件则执行语句块,否则跳过语句块。

5.1.2 双分支选择结构

满足条件表达式,执行一段语句功能内容,不满足则执行另一段功能内容;之后继续往下执行。

if(表达式)

{

语句块1;

}

else

{

语句块2;

}

如果满足表达式,则执行语句块1,否则执行else 语句块2

5.1.3 多分支选择结构

if(表达式1){

语句块1;

}

else if(表达式2){

语句块2;

}

else if(表达式3){

语句块3;

}

……

else{

语句块n;

}

多种情况选择性执行一种,判断第一种是否满足,满足则执行,不满足则判断下一种是否满足,满足则执行,不满足则继续判断.....

注意:if选择,只看真假,经过各种运算得到 0 或者 非0 都可以。

5.2 switch...case选择结构

switch选择结构,根据表达式的结果表示从多种情况进行选择,选择情况(表达式 == 情况)进行执行对应的语句块。

switch (表达式)

{

case 常量表达式1:语句块1;break;//每个case 就是一个情况

case 常量表达式2:语句块2;break;

case 常量表达式n:语句块n;break;

default: 默认情况语句段n+1;[break];

}

注意:表达式和常量表达式 结果为 整型(因为要判断相等)

比较 switch 表达式   是否 等于  case 常量表达式 ,如果相等 则执行对应的语句块。

default 表示如果 switch 和case 比较所有都不相等,则执行default 默认语句块。

当switch 表达式和 case 表达式 比较相等后则执行对应的语句块,同时所有的case 表达式都失效(则会从当前case 一直往后执行,直到swicth结束)。

break:表示结束当前switch。

6、循环结构

6.1 while循环

while (表达式)-------条件,是否重复执行

{

循环体语句;------要重复执行的内容

}

表达式为真,则执行一次要重复的内容(循环体语句),再次判断表达式是否真,表达式位置,则再次执行一次要重复的内容,继续判断表达式,直到表达式为假,则跳出循环执行while的后面内容。

6.2 do...while循环

do...while循环:先直接执行一次循环体,条件表达式从第二次开始判断是否满足,满足则执行

语法结构:

do

{

循环体语句;

}

while (表达式);

6.3 for循环

语法格式:

for (表达式1;表达式2;表达式3)

{

循环体语句;

}

表达式1:在整个for循环之前执行一次,且只执行一次,通常用于在for循环初始化条件的值(可以不进行设置,相当于没有初始化,可能在其他之前位置设置)

表达式2:循环条件,每次执行循环体前,先判断条件是否成立(判断一次,执行一次循环体)(可以不设置,相当于 条件一直为真 1)

表达式3:每次在执行一次循环体后,就立即执行(先于下次的条件判断),通常用于设置改变条件(可以不设置,相当于在表达式3中无操作)

表达式可以省略,但是 ; 必须添加。

6.4 循环的嵌套

在循环内部循环体语句可能包含另一个循环,叫做循环的嵌套

while()

{

循环体

for(;;)

{

循环体语句;

}

}

外层循环执行一次,内层循环执行完一遍

6.5 break和continue

6.5.1 break

break:break语句作用是结束当前这个循环,跳出当前循环

while()

{

break;-------从当前位置结束整个循环

}

6.5.2 continue

continue:提前结束循环中的本次循环,跳过本次循环体没有执行完的内容,直接进行下一次。

while循环使用continue直接结束本次循环体内容,直接进行下一次条件判断。

for循环使用continue直接结束本次循环体内容,但是由于for循环在结束一次循环后,会执行表达式3,所以continue结束时,跳到表达式3执行,进行下一次条件判断。

7、函数

7.1 函数定义

函数包含两部分---函数头与函数体

定义:

返回值类型 函数名(参数列表)

{

函数体——函数实现特定功能的过程;

}

返回值类型:函数功能结束,返回的结果是什么类型,表示有一个结果返回。

函数名:标识符,表示这个功能的名字,之后就使用这个名字来标识使用这个功能函数。

参数列表:在编写功能时不确定,需要在调用使用这个函数,传递的值。

函数体:功能模块的操作代码--功能的实现。

7.2 函数定义和调用

我根据自己理解写的。

void是空类型,没有数据类型,没有返回值可以使用void修饰返回值类型。有返回值在定义函数时就要给定返回值类型 如int、 float、 char等。

return:只要执行到return 语句,表示函数功能到这里结束

return + 值:结束当前函数,同时把值 返回,返回到调用位置(在调用位置得到函数的执行结果)

对于有返回值类型,在函数体中 必须包含 return + 值 语句

7.2.1 无参无返回值

void 函数名()

{

函数体;

(return;)//可写可不写

}

int main()

{

函数名();//调用

}

7.2.2 无参有返回值

返回值数据类型 函数名()

{

函数体;

return 表达式值;

}

int main()

{

函数名();

}

7.2.3 有参无返回值

viod 函数名(参数类型1 变量名1, ....)

{

函数体;

}

int main()

{

函数名(参数值1,...);//括号里面也可以是变量,表示把变量的值传递给函数的参数列表,而不是把变量直接传递给参数列表

}

7.2.4 有参有返回值

返回值类型 函数名(参数类型1 参数名(变量名)1,...)

{

函数体;

return 值;

}

int main()

{

函数名(参数值1,...);

}

7.3 函数的嵌套调用

在调用一个函数的过程中,被调用的函数又可以调用另一个函数。

函数的定义是平行的、独立的,不允许嵌套定义

7.4 函数的声明

编译时提示函数是什么样子的函数(有无函数,函数有无返回值,有无形式参数列表)

如果在前面调用了函数,在后面位置才进行定义需要在调用前进行声明

函数声明 语法:

返回类型  函数名(形式参数列表);

写法:

返回类型函数名(参数类型1,参数类型2,参数类型3....);

返回类型函数名(参数类型1  参数名1,参数类型2  参数名2,参数类型3 参数名3....);

7.5 递归函数

函数中直接或间接调用自己这个函数,叫做函数的递归调用,当前函数也叫做递归函数。

通常递归函数需要用结束条件,在函数内部加控制语句,只有当满足一定条件时,递归终止。

8、全局变量与局部变量

8.1 局部变量

只要在函数内部定义的变量就叫做局部变量。

函数的形式参数类似局部变量 ,与局部变量有相同的性质。

性质:生命周期:存储期限。变量的存储期限,在变量所在程序区块执行期间有效存储,区间结束或函数返回时,局部变量的值无法保留。

作用域:局部变量在定义所在的区域块内访问可达,离开区块不可访问。

程序块:用一对大括号{}括起来多条语句区域就是一个程序区块。

8.2 全局变量

不在函数内定义的变量叫做全局变量。

性质:生命周期:存储期限。变量的存储期限,在整个程序运行期间都存在有效。

作用域:从变量被定义的点开始一直到所在文件的末尾都可以使用访问。

8.3 变量名的重名

在程序中,如果作用域相同则变量不能相同。在不同作用域时,允许定义相同的变量名,如果存在相同的变量则默认使用作用域小的变量进行操作。

8.4 变量的默认值

当变量定义时,如果没有进行初始化时,变量的默认值:

局部变量:随机值

全局变量:默认初始化为0

8.5 static存储类型

static静态存储类型

static修饰局部变量:

延长生命周期为整个程序(程序结束变量的生命周期结束),但是作用域不变,只能在定义变量的作用域中使用(但作用域仍为局部)

当多次定义static 的局部变量时,只会定义第一次,之后都是跳过定义

static修饰全局变量:

设置为静态变量,只能在本文件内使用这个变量

static修饰的变量未初始化会自动初始化为0。

9、数组

9.1 一维数组

9.1.1 定义

类型   数组名[数组长度];

类型:每个数据的类型

数组名:整个数据集合的名字

数组长度:数据集合中数据的个数

如:int   a[4];

占用内存空间:类型 * 数组长度

以连续的内存空间创建数组,每个数组元素是相邻的。

9.1.2 一维数组元素的访问

存取特定的数组元素,通过数组名在后边加上一个用方括号表示整数值(整数值:数组取下标、索引:从0开始的编号位置)。

格式:

数组名[下标]

下标:下标值只能是整数或结果为整数的表达式,取值范围是 0   ~   数组长度 - 1

注意:如果下标>= 数组长度 叫做越界,不能使用。

9.1.3 一维数组的初始化

在定义一维数组时,可以对数组进行初始化,对数组进行初始化就是对数组的元素进行初始化

使用一个 {},在花括号中,添加要对数组元素初始化的值

格式:

类型  数组名[元素个数] = {值1,值2,值3};

完全初始化:

类型  数组名[元素个数] = {值1,值2,值3 == 元素个数};

对数组中每个元素都进行初始化赋值,会按照值的顺序依次对数组元素进行初始化

例:float price[5] = {1,2,3,4,5};

部分初始化:

类型  数组名[元素个数] = {值1,值2,值3 < 元素个数};

按照顺序依次初始化 数组中前几个值,未初始化 会有编译器初始化为0,例:

float price[5] = {1,2,3}

指定初始化:

类型  数组名[元素个数] = {[下标] = 值1,[下标] = 值2,[下标] = 值3};例:

float price[5] = {[0] = 1,[4] = 2,[2] = 3};

在进行初始化时,由于会编写元素值,可以使用值的个数来表示元素个数,在定义的位置元素个数可以不写

类型  数组名[]= {值1,值2,值3};----虽然不写,但是有值的个数个元素

9.2 二维数组

二维数组:一维数组的集合,集合中的数组元素是一维数组

9.2.1 二维数组的定义

定义:

数据类型  数组名[常量表达式1][常量表达式2];

数据类型:一维数组的元素数据类型

常量表达式1:二维数组的元素个数(有几个一维数组)

常量表达式2:在二维数组中的一维数组的元素个数(一维数组中有几个元素数据)。

当定义了二维数组,在内存中存储二维数组,是按照行顺序,即先存储第一行(二维数组第一个一维数组),在存储第二行(二维数组第二个一维数组)。

9.2.2 二维数组的访问

数组名[二维数组下标]:二维数组中的某个一维数组

数组名[二维数组下标][一维数组下标]:二维数组中的一维数组的数据元素。

9.2.3 二维数组初始化

把二维数组按顺序,从第零个一维数组依次进行初始化

数据类型  数组名[常量表达式1][常量表达式2] = {值1,值2,值3,....};

int a[2][4] = {1,2,3,4,5,6};

把二维数组,每个{}表示初始一个一维数组

数据类型  数组名[常量表达式1][常量表达式2] = {{值1,值2},{值3,.}...};

int a[2][4] = {{1,2},{5,6,7}};

对于二维数组初始化时可以不指定一维数组的个数

即:数据类型  数组名[][常量表达式2] = {};

int a[][3] = {1,2,3,4,5,6,7,8};-------有3个一维数组

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值