C语言第五课
目录
1.常见关键字
关键字–C语言本身内置的,关键字不是自己创建出来的,也不能创建出来的。C 语言一共有32个关键字,根据功能不同,可以分以下四类:
- 数据类型关键字(12个)
(1)char: 声明字符型变量或函数(1字节)
(2)short: 声明短整型变量和函数(2字节)
(3)int: 声明整型变量或函数(2/4字节)
(4)long: 声明长整型变量或函数(4/8字节)
(5)float: 声明浮点型变量或函数(4字节)
(6)double: 声明双精度变量或函数(8字节)
(7)signed: 声明有符号类型变量或函数
(8)unsigned: 声明无符号类型变量或函数
(9)void: 声明函数无返回值或无参数,声明无类型指针
(10)enum: 声明枚举类型
(11)struct: 声明结构体变量
(12)union: 声明共用体(联合)数据类型- 控制语句关键字(12个)
循环语句
(1)for: 一种循环语句
(2)do: 循环语句的循环体
(3)while : 循环语句的循环条件
(4)break: 跳出当前循环
(5)continue: 结束当前循环,开始下一轮循环
条件语句
(6)if: 条件语句
(7)else: 条件语句否定分支(与 if 连用)
(8)goto: 无条件跳转语句
开关语句
(9)switch : 用于开关语句
(10)case: 开关语句分支
(11)default:开关语句中的“其他”分支
返回语句
(12)return:子程序返回语句(可以带参数,也可不带参数)- 存储类型关键字(4个)
(1)auto: 声明自动变量
(2)extern: 声明全局变量
(3)register: 声明寄存器变量
(4)static:声明静态变量- 其他功能关键字 (4个)
(1)const: 声明只读变量
(2)sizeof: 计算存储空间
(3)typedef: 给数据类型取别名
(4)volatile: 说明变量在程序执行中可被隐含地改变
其中auto(自动变量)是常常被忽略的关键字
(auto) int a=10;//自动变量,auto被忽略
1.1关键字typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名。typedef只针对类型。
#include//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名typedef unsigned int uint_32;int main(){//观察num1和num2,这两个变量的类型是一样的unsigned int num1 = 0;uint_32 num2 = 0;printf("%d %d",num1,num2);return 0;}
1.2关键字static
在C语言中:static是用来修饰变量和函数的
- 修饰局部变量-称为静态局部变量
- 修饰全局变量-称为静态全局变量
- 修饰函数-称为静态函数
static修饰局部变量
a. 函数中局部变量:
声明周期延长:该变量不随函数结束而结束
初始化:只在第一次调用该函数时进行初始化
记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值
存储位置:不会存储在栈区,放在数据段
例如:无static修饰的局部变量
```bash```bash```c#includevoid test(){ int a=1; a++; printf("%d",a);}int main(){ int i=0; while(i<10) { test(); i++; } return 0;}
有static修饰的局部变量:
#includevoid test(){ static int a=1; a++; printf("%d",a);}int main(){ int i=0; while(i<10) { test(); i++; } return 0;}
可以看出没有static修饰局部变量a时候,输出结果是10个2,有static修饰局部变量a的时候,输出结果是2到11。这是因为static修饰局部变量时候,局部变量出来作用域,不被销毁的,本质上static修饰局部变量,是通过改变变量的储存位置由栈区变到静态区,也使该变量的生命周期变长,使其生命周期和程序生命周期一样。
static修饰全局变量
全局变量是具有外部链接属性的(编译+链接=可执行程序)
static修饰全局变量时候,全局变量的外部链接属性变成了内部链接属性。其他源文件(.c)就不能再使用这个全局变量。(作用域变小了)
例如:没有static修饰全局变量时候
有static修饰全局变量时候
static修饰函数
函数也具有外部链接属性,被static修饰时候,外部链接属性变为内部链接属性,其他源文件(.c)不能再使用该函数。
例如,没有static修饰函数时候:
有static修饰函数时候:
2.define定义常量和宏
//define定义标识符常量#define MAX 1000//define定义宏#define ADD(x, y) ((x)+(y))//其中Add是宏,x和y是宏的参数,参数是无类型的,其中((x)+(y))是宏体#include int main(){int sum = ADD(2, 3);printf("sum = %d\n", sum);sum = 10*ADD(2, 3);printf("sum = %d\n", sum);return 0;}
以后详细讲解。
3.指针
指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。
3.1内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。例如:
就比如一栋居民楼中每一个房间都有一个编号,可以通过这些编号快速查询到相应的房间。
上图中0x00AFFDF0是储存a的地址,也是向内存申请4个字节中的首地址,其中&是取地址操作符
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。取出变量地址如下:
#include int main(){int num = 10;#//取出num的地址//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)printf("%p\n", &num);//打印地址,%p是以地址的形式打印return 0;}
此时0053FD9C是num的地址。
内存单元:编号–》地址–》地址也被称为指针
那地址如何存储,需要定义指针变量。存放指针(地址)的变量就是指针变量
int num = 10;int *p;//p为一个整形指针变量p = #
*说明p是指针变量,int说明p(指针变量)指向的对象是int类型的
*p是解引用操作符,就是通过p中存放的地址,找到p所指的对象,其中 *p是p的指向对象。
#include int main(){int num = 10;int *p = #*p = 20;return 0;}
指针变量的大小
#include //指针变量的大小取决于地址的大小//32位平台下地址是32个bit位(即4个字节)//64位平台下地址是64个bit位(即8个字节)int main(){printf("%d\n", sizeof(char *));printf("%d\n", sizeof(short *));printf("%d\n", sizeof(int *));printf("%d\n", sizeof(double *));return 0;}
这是32位机器的地址下的指针大小。
这是在64位位机器的地址下的指针大小。以后详细讲解
结构体
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
比如描述学生,学生包含: 名字+年龄+性别+学号这几项信息。
这里只能使用结构体来描述了。例如:
struct Stu{//成员char name[20];//名字int age; //年龄char sex[5]; //性别char id[15]; //学号};
//打印结构体信息struct Stu s = {"张三", 20, "男", "20180101"};//.为结构成员访问操作符printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);//结构体对象.成员名//->操作符struct Stu *ps = &s;printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps->id);//结构体指针变量-->成员名
以后详细讲解。
总结
今天学到了很多知识点,特别是结构体是C语言中很重要的知识点,指针又是C语言中的难点,这些知识点将在以后在小沐文章中揭开神秘面纱。如果以上有什么不足之处,还望指正,谢谢。