学完这段差不多C语言就能认识个7788了,拿到一段代码就可以尝试分析了。
简单的列出这些东西的原因就是在我们定义变量的时候不能和这些关键字相同。
目录
Auto
自动的意思,因为局部变量是自动创建,出了局部范围结束生命周期他就销毁了,这些创建销毁是自动的,所以也叫他自动变量,我们的每个局部变量前都有一个auto只不过省略了,比如:auto int a = 2;
Brake
能结束循环
case
不懂
Const
修饰一个常变量‘
Continue
继续的意思,在循环里面使用。
Default
默认的意思
If/ else
选择语句
While/ of/ do
循环语句
类型
Char 字符类型;int 整形;long 长整型;short 短整形;
Float 单精度浮点;double双精度浮点;
为什么会有这么多类型?因为类型决定了我们如何去解释计算机中储存为二进制序列的数据。
Enum
枚举 常量
Extern
引入外部符号。
声明要使用其他源文件里面的函数或者变量。
格式:extren 函数返回值 函数名(函数参数);
extern 变量类型 变量名 ;
在声明的时候,并没有开辟空间所以在声明变量的时候不可以对它进初始化或者赋值!
在vs编译器中跨文件使用函数可以省略声明。跨文件调用函数省略extern声明之后编译器会提示错误但是会在其他源文件查找到该函数,因此代码会正常运行,但是不推荐这样做,因为会给编译器增加负担。
Goto
goto语句:
{ goto 标识符;标识符:}就相当于在函数内部安装两个单向传送门,一但遇到goto语句+标识符,就会传送到对应的标识符冒号后面。goto语句虽然很牛逼但是只能在函数内部传送,不能传出本函数。
Register
寄存器关键词,建议把一个变量存入寄存器中使用。它只是建议把变量存入寄存器,但是存不存还是看编译器怎么想。
Return
返回
Signed/ unsigned
有符号数,因为我们写的数都默认有符号,所以signed默认省略的,比如int = 1;其实是signed int = 1;当然定义无符号数的时候,就是unsigned,加了这个不管怎么样都是无符号数,不管怎么写都是个正数。
Sizeof
用来计算大小.计算:数组,类型,变量的占用内存大小。
Static
Static可以用来修饰函数,局部变量和全局变量。
在它修饰局部变量时,会使其变成静态变量,若是在一个循环体内部进行声明,二次循环至此时不会重新给变量重新声明,声明只能有一次。局部变量出了它的作用域它的生命周期也随之结束。所以static的本质就是延长了局部变量的生命周期至作用域外。但是,他的作用域还是不变。
怎么理解这个生命周延长作用域不变呢,就是代码执行起来的时候,他有个顺序吧,顺序是出了这个局部变量的作用域,他还是不可以使用,但是呢!如果我回来了,代码执行了一圈现在又需要回到这个变量的作用域内执行,那是不是如果这个变量生命周期没结束还活着,就可以延续上次的值继续调用
图解:
若用static修饰全局变量,其作用是限制全局变量的作用域仅在当前的源文件内部。本质为改变作用域。
Static也可以修饰函数,static修饰函数会改变函数的连接属性。一个正常的函数的连接属性都是外部连接属性,在外部源文件使用的时候声明即可。若是函数被static修饰,则其外部连接属性变成内部连接属性。该函数只能在源文件内部直接使用,不可以跨源文件被extern 直接调用。
Tips:虽然被static修饰的函数已经无法跨源文件被直接调用,但是还是可以通过函数嵌套间接调用。在此函数源文件内部创建一个新的函数,此函数的解决方案为“调用被static修饰的函数”。然后在其他源文件声明这个新的函数就达到了间接调用被static修饰的函数的目的。
Struct
结构体关键字
Switch
分支语句
Typedrf
类型定义,重新定义变量的名字,但是无法改变其本质,就相当于给变量起一个外号,在频繁使用同一个变量的时候,若它的名字很长,频繁的敲就浪费时间,用typedrf给它起个别名,用的时候就可以比较方便的用别名来引用它。
Union
联合体/共用体(表示很懵)
Vold
无/空
Volatile
高级的东西。
指针
单目操作符 * ,叫做解引用操作符。
指针变量,是专门用来存放地址的变量。
在声明变量时中间加上* 比如:
这就是指针变量。如上图,int *p这个指针变量已经存放了a的地址,如果这时我们给int *p赋值,因为它存的是a的地址,通过*p找到了a的地址之后,就值赋给a。
int * p它整体所表达的意思就是p是一个指针变量。
但是分开来说,int 所表达的意思是这个指针变量所指向的地址所存放的变量的的类型,是int,这就是指针类型。而这个*所表达的意思是p为指针变量,专门存放地址的。这里的*和在引用指针变量的解引用操作符本质上不一样!
指针变量,因为是存放地址的,地址占用多大的空间,则指针变量就多大。规定内存中的一个空间是8bit,即1字节一个空间。32位系统中一个指针变量所占的内存则为4字节。
#define
它和定义函数与定义变量就很像。比如:
int a;
int a();
他们有什么区别?
就是int a 是定义一个变量,int a()是定义一个函数,前者是变量名为a,后者是定义的函数名为a。
#define也一样,前面说常量的时候说过这个东西,像 #define a 1,他就是定义一个常量a值为1。但是如果是这样的 #define a (),这就不一样了啊,这和上面差不多,这是定义一个宏,宏的名字为a,宏的参数就是括号里的值。而宏的解决方案就是在后面再加一个括号里面填。
输出结果是11,简单明了。定义 一个宏名为a,参数为x和y,解决方案是x+y。定义一个整型变量b初始化为0,调用宏a,参数为5和6分别映射到x和y,宏返回的结果整型数据11赋值给变量b。打印b。
要注意啊!定义宏的时候从宏名和参数的括号中间不能加空格。
语句
在c语言中,用一个分号隔开的就是一条语句。
结构体
C语言有许多的类型使我们很方便的去解释与之对应的数据,那么若是有一些数据内包含一批不同类型的数据,那么该用哪种类型去定义呢,总不能一直用字符串吧。
这就得用到结构体类型了,结构体类型函数struct 。
用法 :struct [结构体类型 类型名] { 该类型包括的类型 } ;
结束结构体定义的时候一定要加上分号!表示定义结束。比如:
创建一个结构体类型,类型为water,类型water由长度为6的字符串mz和整型变量jq组成。创建完类型就可以创建该类型的变量:
和常规变量一样的方法,变量类型后面跟上要定义的变量名称。调用结构体类型,定义结构体类型时必须初始化,且初始化结构体类型必须用大括号!初始化结构体类型中的多个成员时在同一个大括号里面用逗号隔开。
调用结构体类型变量:
. 小数点用来找到结构体变量里面的成员
结构体类型变量它还是存放在内存中的一块地方的,所以指针变量也可以指向结构体。
结构体变量的指针变量类型和我们创建的类型一致,例如
在指针变量里调用结构体成员时不单单只能用小数点:
若是用指针变量存放了结构体变量,在调用结构体变量里的成员时可以直接使用指针-> 指向成员,即可调用。
两个操作符 . 和 -> 的作用就是这些;
点 “ . “是找到结构体中的成员,箭头是结构体类型指针指向成员 。
到这里概览就记得差不多了,来初步的认识了一下c语言的整体,学明白这一节应该遇到一段代码的时候就可以大概的去理解它啦。