《C语言》2022山西专升本C语言知识点

目录

一、基本定义

二、顺序程序设计

三、选择结构

四、三种循环结构

五、数组

六、函数

七、指针

八、结构体、共用体、枚举

九、文件

十、预处理

扫描二维码关注公众号,回复: 14626708 查看本文章

一、基本定义

一、概念

1.机器语言(计算机可以直接编译识别)链接-->符号语言(汇编语言)编译-->高级语言(编译);

2.编译器:经过一次编译之后不需要重新编译[c语言、c++、java];

3.解释器:每一次都需要重新解释[pyhton];

4.程序结构:顺序结构、选择结构、循环结构;

5.程序都是以main()函数开始执行,有且只有一个主函数,然后按照从上到下开始执行(遇到循环做循环,遇到选择做选择,遇到函数做函数);

6.计算机的数据在电脑中保存是以二进制的形式存放;

7.C语言的关键字 (auto   break   case   char   const   continue default   do)

①.数据类型关键字: char   double   enum   float   int   long short     signed    struct   union   unsigned   void

②.控制语句关键字: for   do while   break   continue   return   if else   goto   switch   case   default

③.存储类型关键字: auto   extern  register   static

④.其它关键字: const//声明只读变量   sizeof   typedef   volatile//变量在执行程序中可被隐含改变

二、常考概念

1.预处理#define PI 3.14 不是c语言的一部分,不占运行时间,不加分号,c语言编译的程序称为源程序,它以ASCII码存放在文本文件中;//#define PI 3.14;这个写法是错误的,预处理不应该出现分号

2.每个c语言程序中的main函数有且只有一个;

3.函数可以嵌套调用不可以嵌套定义;

4.对于变量的隐含存储类型为auto;

5.对于函数的隐含存储类型为extern:拓展作用域;

6.主函数可以分为两个部分:函数说明部分和主函数体;

  1. 任何非主函数可以调用其他任何非主函数;

(一个函数直接或间接调用函数本身称为函数的递归调用)

7.c语言执行的步骤和方法:.c[源程序]---编译--->.obj[目标文件]---连接--->.exe[可执行文件];

(.c--->.obj--->.exe)//.c和.obj文件是无法运行的,.exe才可以运行先编译,后连接,最后运行;

8.c语言编写的程序称为源文件,也称为编译单位;

9.如果一条语句只有一个分号  ;  这个语句就为空语句;

10.标识符:

(1)必须由字母数字下划线组成,开头只能为字母或者下划线;

(2)标识符分为关键字、预定义标识符、用户标识符;

(3)关键字不可以作为用户标识符(由用户自己定义的标识符称为用户标识符);

4)main、define、scanf、printf都不是关键字(!!!);

(5)迷惑If可以作为标识符(因为if首字母大写了,所以不是关键字);

(6)预定义的标识符有define、scanf 、printf、include;

(7)预定义标识符可以作为用户标识符;

11.语句和表达式的区别是有无分号,语句有分号,表达式没有;

12.表达式的运算对象可以是常量、函数调用、变量;

13.c程序的基本组成单位是函数;

三、算法

1.算法的特性:有穷性、确定性、有效性、有一个或多个输出,有零个或多个输入;

2.如何描述一个算法?

用自然语言表示算法、

用程序流程图表示算法、

  1. S流程图表示算法、

用伪代码表示算法、

用计算机语言表示算法;

3.算法:可以没有输入,但是一定要有输出;

四、进制转换

1.所有的进制转换都按照转为二进制再转为其他进制;

2.八进制转二进制按照3位计算,十六位转二进制按照4位计算;

3.c语言中只有八、十、十六进制,没有二进制。但是运行的时候,所有的进制都要转换成二进制来进行处理。

4.规定

A .c语言中规定八进制开头要以0开头。018是非法的,八进制没 有8 逢8进1;

B .c语言中规定十六进制开头要以0x开头,输出小写%x,输出大写%X;

二、顺序程序设计

一、常量

1.整形常量:

134(十进制数)、 034(八进制数)、 0XA2(十六进制数)、

45L(长整形)、   7UL(无符号的长整形)、8U(无符号的整形)

U代表unsigned    L代表long

  1. 实型常量:

1.3(double类型)、  1.5f、1.5F(float类型)、

1.4e3(指数表示)、1.4E-3(可大写);

float 有效精度6位  double 有效精度15位;

a. 2.333e-1就是合法的,且数据是2.333*10的负一次

b.考试口诀e前e后必有数,e后必为整数 

3.字符常量:‘a’(字符a)、 ‘\n’(转义字符)、 ‘\101’(\后是八进制数)、 ‘\x46’(\x后是十六进制)例:‘\n’ ‘\t’ ‘\\’ ‘\’ ‘\0’;

考试时可能会出现的错误:

a.单个字符错误的形式:‘65’“1”;

B.字符是可以进行算术运算符的:‘0’-  0  =  48;

c.大写字母与小写字母转换方法:‘a’-  32  = ‘A’;

d.‘a’的ASCII码为97,‘A’的ASCII码为65,‘0’的ASCII码为48‘ ’(空格)的ASCII码为32‘\0’的ASCII码为0;

e.‘z’-‘a’=  25;//字母之间相差25位;

4.字符串常量:

“abcde”后面隐藏一个‘\0’;

例:strlen(abcde)=5;

sizeof(abcde)=6;

strlen(abcde\0abcde)=5 //strlen遇到\0结束

sizeof(abcde\0abcde)=12;

strlen(a\nb\t\101dc)=7  a  \n  b  \t  \101  d  c  =7;

5.符号常量#define PI 3.14 //切记预处理后无分号

(1)常量的定义也可以用const定义 例如:const int a;//定义了一个常量a常量a会开辟空间 ;

(2)常量的值不可以改变;

二、变量:

先定义后使用。//定义变量的目的:为变量在内存中开辟空间。

(1)int (4Byte)  short=(short int)(2Byte)  long(long int)(4Byte)

char(1Byte)   float(4Byte)        double (8Byte)

1..引用类型(派生类型)

  数组:(数组类型*个数 例如int a[10]=int *10=(40Byte))

指针:(在64位计算机中占8Byte,32位计算机占4Byte)

结构体:(struct)单独给每一个字节开辟空间;

共用体:(union)共享内存空间,共占最大的成员开辟的内存;

2..函数类型

(1)枚举类型(enum):受限制的整形

(2)void 空类型

(3)无符号类型:unsigned

例:

(1)unsiged long int a=10;//无符号长整型

(2)unsiged b=10;//无符号整形

(3)unsiged int c=10;//无符号整形

(4)unsiged long d=10;//无符号长整形

3.赋值运算符、算术运算符、关系运算符、逻辑运算符

求余运算符%

注意:%左右两边必为整数,被除数为负数 不管除数为正为负,结果都为负数

例: -17%3=-2  17%3 =2  17%-3=2   -17%-3=-2

357%10=7    357/10=35    357/10%10=5

  1. 算术表达式:+ 、 - 、* 、/
  1. 考试时一定注意3/2=1;
  2. 3.0/2=1.5
  1. 复合赋值表达式

int a=2;

a*=2+3//等价与a=a*(2+3)

一定要注意,首先要在2+3上打上括号,(2+3)再进行运算;

  1. ++、- -表达式(自加自减表达式)

口诀:++在前先加后用,++在后先用后+(减法同理)

  1. 逗号表达式

‘ ,’优先级最低,输出最后一个逗号后的值

例:

printf(“%d”,1,2,3);//输出结果为3;

z=(2,3,4)//整个是赋值表达式 z接收到的值为4;

z=2,3,4//整个是逗号表达式 z接收到的值为2;

  1. 逻辑运算符

逻辑表达式:&&(与)、||(或)、!(非)

!> && >||(优先的级别)

c语言中的真用非0来表示,假用0来表示;//非0可以表示整数、小数;

对于关系运算符中:逻辑运算符表示的结果:1为真,0为假;

在c语言中执行表达式a&&b,如果&&前为假,&&后不执行,如果&&前为真才执行后面;

在c语言中执行表达式a||b,如果||前为真,||后不执行,如果||前为假才执行后面;

注:空语句不可以随意执行,会导致逻辑错误;

 注释不是c语言,不占用运行时间,没有分号,不可以嵌套!

  1. 不同类型之间的相互转换

int+int=int    char+int=int

只要有浮点型参与运算,都为double类型

  1. 强制类型转换

例(int)((double)(7/2)+3.5)的值为6

先运算7/2=3    3+3.5=6.5    转换int=6

4.标准类型输入输出

printf(“a=%d\nb=%d”,1,2);//结果为a=1

 b=2

标准的输入输出类型:(正负可参考数轴,左负右正)

%d(整形输入输出十进制数)、

%3d(输入输出占三格靠右)、

%-3d(输入输出占三格靠左)、

%c(输入输出字符)、

%s(输入输出字符串 只需要首元素地址)、

%e(输入输出指数形式)、

%o(输入输出八进制)、

%x(输入输出十六进制)、

%u(输入输出无符号形式)、

%f(输入输出浮点型)、

%lf(输入double类型用)、

%hd (输出端整形)、

%p (输出地址格式)、

%10.5f(输出占10格 小数点也算一位 保留小数点后五位精度 四 舍五入靠右)、

%-10.5f(输出占10格 小数点也算一位 保留小数点后五位精度 四舍五入靠左);

%%(输出一个%)、

%#o(带前导的八进制)、

%#x(带前导的十六进制);

注意:在输入的时候,要严格按照输入格式进行输入

例:scanf(“a=%d”,&a);//输入的时候就需要输入a=1;

这样才能赋值给a;

对于输入实型数据时,float要按照%f进行输入,double要按照%lf进行输入;

当有定义 int a,b;

scanf(“%3d%d,&a,&b);//输入12345 123 接收到的a=123,b=45;

scanf(“%d%3d,&a,&b);//输入12345 123 接收到的a=12345,b=123;

注:char s[30],s2[30];

使用scanf(“%s %s”,s,s1);//中间必须使用空格间隔,不要使用其它字符;

常用的输出函数:

getchar()、//接收输入一个字符;

putchar( )、//输出一个字符;

gets()、//输入一个字符串;

puts();//输出一个字符串;

如何将两个变量a,b的值互换?a=t;a=b;b=t;

a=a^b;b=a^b;a=a^b;按位异或;//转八位二进制运算

如何将两个变量a,b按照从小到大或者从小到大排序,这个公式有推广意义!

三、选择结构

  • if...else...

1.对于if...else if...else...只能选择优先满足的条件执行,其他的不执行,else总是与他最近的if相连;

注:if(a>5);//这句话是空语句,只有单独一个分号;

  1. 注意区别:
  1.  if(a>b)t=a;a=b;b=t;
  2.  if(a>b){t=a;a=b;b=t;}

这两句话意思是不一样的,注意分辨,if后如果没有{},那么他的执行语句只有紧跟着他的第一句遇到;结束

//所以,在编程或做题中,一定要看清if语句的作用范围;

  • 条件表达式(c语言中唯一的三目运算符)

一般形式为:(表达式1)?表达式2:表达式3;

执行方向从右向左执行;

口诀:真前假后;

在C语言中,结果1 和 结果2的类型必须一致

  • switch语句
  1. 首先要明确他的格式

  1. 执行的流程一定要弄懂;
  2. 有无break的区别:
  1. 没有:只要有一个case满足了,就从case开始一直往下执行
  2. 有:遇到break直接跳出了switch语句;

break在c语言中就是分手,一刀两断;

  1. switch只可以和break一起使用,continue不可以;
  2. 既然大家都了解switch性质了,那么来做一道题

这样写是否正确?

答案是正确的,continue是对于循环体的,对于switch没有任何效果

且输出结果为1*3*5*

switch是每年必考题目,一定要使用熟练

四、三种循环结构

  1. while循环:while(循环条件){循环体;}
  2. do while循环:do{循环体}while(循环条件;);//切记最后有分号
  3. for循环:for(初值;循环条件;循环增量){循环体;}
  • 循环概念

1.while循环与do while循环的区别:do while会无条件循环一次再进行判断;

2.for循环中有两个分号;

3.写程序的时候一定注意写好循环条件,否则就成为了死循环;

三、break与continue的区别

1.break:break是打破的意思,破坏了整个循环,所以遇到break就跳出本层循环;

2.continue:continue是继续的意思,但是要结束本次循环,循环体剩下的语句不再执行,跳到循环开始,然后判断条件,继续循环;

五、数组

一、数组的概念

1.数组的基本概念:连续存放的集合,所有的元素类型必须相同

[基本数据类型、结构体];

举例:struct Stu{....};struct Stu a[10];

int a[10];

  1. 定义数组个数只能用常量或表达式,不可以是变量

例如   int a[10];

        int a[5+5];

        #define N 5  int a[N+4];

int n=10; int a[n];//错误的定义数组方法

二、一维数组

1.定义:数据类型 数组名称[常量表达式];//auto int a[10];

2.struct Stu{....};struct Stu a[10];//数组a的每一个元素都是Stu类型的

a为数组首元素的地址;10表示数组元素的个数;数组中的每一个元素在内存中都是连续存放的;

  1. 一维数组的初始化和数组的使用:4种形式。
  1. int a[10]={...};//对于数组的每一个元素初始化值
  2. int a[10]={0};//数组的全部元素初始化为0
  3. int a[10];a[0]=1;//对数组的一个或多个元素赋初值,其余元素为不确定的值
  4. int a[10]={1,2};//对数组一个或多个元素赋初值,其余元素为0

注意:int a[5]={1,2,3,4,5,6};是错误的,下标越界;

  • 二维数组
  1. int a[3][4];一共有3*4(12)个元素,每一个元素都是int类型的,数组名称为数组首行元素的地址;这个数组有三行四列;
  2. 二维数组的每一个元素在内存中都是按行连续存放的;
  3. 二维数组的初始化:
  1. int a[3][4]={...};//对于数组的每一个元素初始化值
  2. int a[3][4]={1,2};//对数组的一个或多个元素赋初值,其余元素为0
  3. int a[3][4]={0};//数组的全部元素初始化为0
  4. int a[3][4];a[0][0]=1;//对数组的一个或多个元素赋初值,其余元素为不确定的值
  5. int a[][4]={...};//对数组的每一个元素赋初值,省略行个数
  • 字符数组
  1. 字符串数组

(1)字符串输入和输出的方式:

输入  gets();//可以接收任何中间带空格的字符串

      scanf();//不能接收中间有空格的字符串以空格作为间隔符

输出

puts();

printf();

2.字符串二维数组

char a[4][10]={"aaaa","bbbb","cccc","dddd"};//数组中每一行都是字符串

  1. 字符数组常用函数

来自头文件#include<stdio.h>

a=getchar();//接收键盘上的一个字符赋值给a

putchar(a);//输出a所存放的字符

gets();//接收一个字符串

puts();//输出一个字符串

#include<string.h>//切记使用前加头文件

strcat(字符串1,字符串2);//将2连接到1后

strcpy(字符串1,字符串2);//将2复制给1

strcmp(字符串1,字符串2);//比较1和2的大小,

如字符串1>字符串2返回正整数,

字符串1==字符串2返回0,

字符串1<字符串2,返回负整数;

strlen(a);//字符数组a的长度(不包括‘\0’);

sizeof(a);//需要头文件#include<stdio.h>,数组a所占内存空间;

strlwr(a);//将字符数组中的所有大写字母转为小写;

strupr(a);//将字符数组中的所有小写字母转为大写;

六、函数

  • 函数的概念
  1. 一个函数表示一个功能模块,是c语言的基本组成单位;
  2. 一个c程序是由一个或多个程序模块组成的,每个程序模块作为一个源文件;一个源文件是有一个或多个函数以及其他内容组成的。
  3. 所有函数都是平行的,相互独立的;
  4. 函数分为库函数(string.h或math.h)和用户自定义函数;
  5. 函数的形式分为无参函数和有参函数;

  • 函数的调用过程
  1. 在定义函数中指定的形参变量,在未出现函数调用时,它们并不占用存储,只有发生函数调用时,函数中的形参才被分配内存单元;

  1. 实参与形参传递:
  1. 都是变量时:单项值传递;
  2. 都是数组时:单向地址传递;
  1. 如果函数有return语句,则可以通过return将函数值带回主函数;
  2. 调用结束后,形参单元将被释放;

注:在定义一个带有返回值的函数时,我们要避免一下情况出现:

!!!当a<0时,函数的返回值不可控;

注:实参可以是常量、变量或表达式,但是要求他们有确定的值、在调用时将实参的值赋给形参变量,如果形参是数组名,则传递的是数组首元素的地址;

  • 函数的嵌套
  1. 一个函数内不能再定义另一个函数,但是可以调用另一个函数;
  2. 函数不能嵌套定义,可以嵌套调用
  • 函数的递归
  1. 在调用一个函数的过程中有出现直接或间接地调用该函数本身,成为函数的递归调用;
  2. 一个递归函数包括两个必要条件:1.函数的出口;2.函数的递推;

  • 全局变量与局部变量(内部变量)
  1. 全局变量从定义开始在本源程序中全部有效;
  2. 局部变量只在定义的函数体内有效;
  3. 在同一函数中如存在全局变量与局部变量重名,全局变量被屏蔽,局部变量优先级>全局变量

巧记:作用域越小;权位越大;

例:大三年级有五个班级,大三中有两个人都叫张三,但是在对于一个班级中,只有一个张三,所以到了一个班级中,张三只对于本班级中的张三生效,所以在局部变量中,全局变量被屏蔽;

  1. 函数内定义的变量都是局部变量(除特殊声明后),没有默认值;
  2. 函数外定义的变量都是全局变量,默认赋值0;

例:对于整形全局变量赋值为0;

 对于浮点型全局变量赋值为0.0;

 对于字符型全局变量赋值为‘\0’;

 对于数组型全局变量全部赋值为0;

  • 变量的存储方式
  1. 自动变量:auto:不声明时定义的变量都为自动变量;

在调用函数结束,这些变量会自动释放;定义时关键字可以省略;

  1. 静态变量:static:使用后变量不会被释放;继续保存值
  2. 寄存器变量:register:存放在寄存器中的变量,可以用于提高运算速度;
  3. 外部变量:extern:函数的默认类型

本章节考点:

函数的声明应当注意一定要有函数的类型,函数的名称,函数的参数类型;

要记住经常使用的一些库函数:

数组内容中的库函数

#include<math.h>//切记加头文件

abs()//求绝对值(整形);

fabs()//求绝对值(浮点型);

sqrt()//求开平方根(返回类型为double);

pow(  , )//2的三次可由pow(2,3)来计算;

sin()//求三角函数度数对应的值;

七、指针

  • 指针的概念

1.指针就是变量在内存中的地址;

2.如果有一个变量专门用来存放另一个变量的地址,称为指针变量;

3.指针中存放的是另一个变量的地址,所有指针变量的值都是地址;

4.指针变量的一般形式

类型名  * 指针变量名;

5.在64(32)位计算机中指针所占内存都为8(4)个字节;

6.一个指针变量只能指向同一类型的变量;

7.如果要给一个指针变量赋值,那么它必须指向一个变量;

8.当函数的参数为指针类型时,他的作用是将一个变量的地址传递到函数中;

9.函数的返回值的两种方式:通过return返回值或使用指针返回值;

二、使用指针变量的注意点

1.什么类型的指针变量指向什么类型的数据;

2.定义一个指针变量的时候,必须给指针变量赋初值否则会出现野指针造成内存泄漏;

3.如果定义一个指针变量没有赋初值要赋给NULL;

4.指针变量只接收地址;

5.指针变量不接收常量;

6.指针可以进行关系运算、减法运算,不能进行加法运算;

*p++ 表示的是先取出p指针地址的值然后地址再加1;

++*p 表示的是先取出p指针地址的值然后值加1;   

*p++ 表示的是先取出p指针地址的值然后将地址的值加1;

 *++p表示的是先将p的地址加1,然后再取出值

*(p++)表示的是先取出p指针地址的值然后地址再加1;

三、用指针引用字符串

char *p//不可以对*p赋值

char p[10]//可以对数组重新赋值

二维数组的地址:会将行地址转换为本行首元素的地址指向函数的指针和返回指针值的函数;

要熟练使用指针指向一维数组和二维数组;

八、结构体、共用体、枚举

  • 定义结构体的三种方式

ps:在对结构体变量初始化时,要对结构体成员一一赋值,不能跳过前面成员变量,而直接给后面成员赋初值,但是可以只赋值前面几个,对与后面未赋值的变量,如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’

  • 结构体数组

数组中的每一个元素都是类型相同自定义类型的变量。

  • 结构体指针 :定义结构体指针可以用来指向结构体数组的每一项;

四、共用体类型(union)

1.在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。

2.共用体的一般形式:

  1. 关键知识点

4.共用体变量中起作用的成员是最后一次被赋值的成员,在对共同体变量中的一个成员赋值后,原有变量存储单元中的值就被取代。

  1. 共用体在任意一个时刻,只有一个成员有意义。并且,对共用体变量赋值,在任意一个时刻只能对一个变量赋值。
  2. 共用体的大小就是最宽基本成员大小,但是要整除最宽基本成员大小。
  • 枚举类型(enum)
  1.  是一个被命名的整型常数的集合
  2. 枚举不是一个数,而是常数的集合,就是说可能是一个或者多个整型常数。
    3.整型:就是int ,说明他不能是float等其他类型。
     常数:说明这个集合里面的几个数都是不能变的。
  • 起外号(typedef)

1.C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。

2.使用typedef后之前被起外号的名称仍然有效;

例如:小明被起绰号为闹铃,那么“闹铃”也可以代表小明,“小明”也可以代表小明;

九、文件

  • 文件的概念
  1. 根据数据的存储方式,可以将文件分为二进制文件文本文件
  2. 文本文件:ASCII文件,每个字节存放一个ASCII码字符便于对字符操作。此类文件以EOF结束。
  3. 二进制文件:数据按其在内存中的存储形式存放便于存放中间结果。
  • 流的概念

分为字符流或字节流

  • 文件名

1.文件组成

  1. 文件路径(2)文件主干(3)文件后缀
  1. 使用文件名称

在c语言中‘\’为转义字符,所以在写程序时需要写为‘\\’

例如D:\str.doc为要使用的文件地址,在编译过程中需要写为“D:\\str.doc”;

  • 文件指针
  1. 文件指针实际上是指向一个结构体类型的指针,这个结构体中包含有:缓冲区的地址、在缓冲区中当前存取的字符的位置、对文件是“读”还是“写”、是否出错、是否已经遇到文件结束信息标志等信息。
  2. 定义文件类型指针变量的一般形式为:FILE *指针变量名
  3. 文件指针来源于头文件#include<stdio.h>
  • 打开与关闭文件
  1. 打开文件的关键字为:fopen(文件名,“文件的打开方式”);

  1. 关闭文件的关键字为fclose(文件指针);
  2. 缓冲区:为了提高传输效率;

十、预处理

  • 宏定义#define

  • 宏定义格式

#define <宏名/标识符> <字符串>

三、简单宏定义的说明

1.宏名一般用大写

     2.宏定义末尾不加分;

     3.宏定义可以嵌套

      4.宏替换在编译前进行,不分配内存,变量定义分配内存,函数调用在编译后程序运行时进行,并且分配内存

     5.预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。

四、带参数的宏定义

       1. 宏名和参数的括号间不能有空格;

      2.宏替换之作替换不做计算,不做表达式求解;

      3.宏的结合不存在类型,也没有类型转换;

      4.宏展开不占用运行时间,只占用编译时间,函数调用占运行 ;

猜你喜欢

转载自blog.csdn.net/m0_69996872/article/details/125805953