> 文档中心 > C语言第五课

C语言第五课


目录

  1. 常见关键字
    1.1 关键字 typedef
    1.2关键字static
  2. #define 定义常量和宏
  3. 指针
    3.1内存
    3.2指针变量的大小
  4. 结构体

1.常见关键字

关键字–C语言本身内置的,关键字不是自己创建出来的,也不能创建出来的。C 语言一共有32个关键字,根据功能不同,可以分以下四类:

  1. 数据类型关键字(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: 声明共用体(联合)数据类型
  2. 控制语句关键字(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:子程序返回语句(可以带参数,也可不带参数)
  3. 存储类型关键字(4个)
    (1)auto: 声明自动变量
    (2)extern: 声明全局变量
    (3)register: 声明寄存器变量
    (4)static:声明静态变量
  4. 其他功能关键字 (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是用来修饰变量和函数的

  1. 修饰局部变量-称为静态局部变量
  2. 修饰全局变量-称为静态全局变量
  3. 修饰函数-称为静态函数

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个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。例如:
C语言第五课
就比如一栋居民楼中每一个房间都有一个编号,可以通过这些编号快速查询到相应的房间。

上图中0x00AFFDF0是储存a的地址,也是向内存申请4个字节中的首地址,其中&是取地址操作符
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。取出变量地址如下:

#include int main(){int num = 10;&num;//取出num的地址//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)printf("%p\n", &num);//打印地址,%p是以地址的形式打印return 0;}

在这里插入图片描述
此时0053FD9C是num的地址。
内存单元:编号–》地址–》地址也被称为指针
那地址如何存储,需要定义指针变量。存放指针(地址)的变量就是指针变量

int num = 10;int *p;//p为一个整形指针变量p = &num;

*说明p是指针变量,int说明p(指针变量)指向的对象是int类型的
C语言第五课
*p是解引用操作符,就是通过p中存放的地址,找到p所指的对象,其中 *p是p的指向对象。

#include int main(){int num = 10;int *p = &num;*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语言中的难点,这些知识点将在以后在小沐文章中揭开神秘面纱。如果以上有什么不足之处,还望指正,谢谢。

旅游攻略大全