本章目录

每篇前言

1.导语

2.目标

3.知识点

一,常见关键字
1,认识关键字
2,关键字分类
2.1,数据类型关键字
2.1.1,基本数据类型关键字
2.1.2,类型修饰关键字
2.1.3,复杂类型关键字
2.1.4,存储级别关键字
2.2,流程控制关键字
2.2.1,跳转结构
2.2.2,分支结构
2.2.3,循环结构
3,详解关键字之static
3.1,static修饰局部变量
3.2,static修饰全局变量
3.3,static修饰函数
4,补充关键字之register
二,define定义常量和宏
1,define定义常量
2,define定义宏
三,指针
1,内存
2,变量地址
3,指针变量
4,指针的使用
5,指针的大小
四,结构体
1,认识结构体
2,初始化结构体
3,输出结构体数据
4,结构体的综合使用

4.结语


每篇前言

博客主页:小杨爱编程☆

作者简介:2022年博客萌新

作者专栏:小杨带你玩转C语言

作者格言:有志者立长志,无志者常立志!

作者请求:由于博主水平有限,难免会有错误和不准之处,希望各位小伙伴能够在留言区批评斧正。


导语

本篇博客主要向各位小伙伴们继续介绍C语言要学习的后续内容,加深对C语言的了解。希望大家能够通过阅读这篇博客,受益良多!


目标

基本了解C语言的基础知识,对C语言有一个大概的认识
每个知识点就是简单认识,不做详细讲解,后期博客会依次更新。


知识点

一,常见关键字

1,认识关键字

由ANSI标准定义的C语言关键字共32个:

auto double int struct break else longswitch

case enum register typedef char  extern return union

constant float short unsigned continue for signed void

default goto sizeof volatile do if while static

2,关键词分类

根据关键词的作用,可以将关键字分成数据类型关键词和流程类型关键词。

2.1,数据类型关键词
2.1.1,基本数据类型关键字(5个)
关键词关键词的解析
char字符型类型数据
int整型数据类型
float单精度浮点类型
double双精度浮点类型
void声明函数无返回值或者无参数,以及声明无类型指针
2.1.2,类型修饰关键字(4个)
关键字关键字的解析
short修饰int,短整型数据类型,可省略int
long修饰int,长整型数据类型,可省略int
signed修饰有符号的整型数据类型
unsigned修饰无有符号的整型数据类型
2.1.3,复杂类型关键字(5个)
关键字关键字的解析
struct结构体声明
union共用体声明
enum枚举声明
typedef类型重命名
sizeof得到特定数据变量和数据类型的大小
2.1.4,存储级别关键字(6个)
关键字关键字的解析
auto自动变量,通常在栈中使用
static静态变量,修饰局部变量,全局变量,函数
register寄存器变量,建议将变量,函数存储在寄存器中
extern声明外部符号,可理解为引用外部对象
constant定义常量,它限定一个变量不允许被改变,产生静态作用
volatile提醒编译器它后面所定义的变量随时有可能改变

由此返回目录

2.2,流程控制关键字
2.2.1,跳转结构(4个)
关键字关键字的解析
return用于函数体中,返回特定值
continue结束当前循环,开始下一轮循环
break跳出循环和switch语句
goto无条件跳转
2.2.2,分支结构(5个)
关键字关键字的解析
if条件语句
else条件语句的否定分支(与if 连用)
switch选择语句(多重分支语句)
case多重分支语句的选择口(与switch 连用)
default多重分支语句的其他选择口(用于switch语句中)
2.2.3,循环结构(3个)
关键字关键字的解析
forfor循环结构,格式:for(初始变量;循环条件;循环变量的改变)
whilewhile循环结构,格式:while(循环条件){循环体}
dodo …while循环结构,格式:do{循环体}while(循环条件);

由此返回目录

3,详解关键字之static

  • static 修饰局部变量
  • static 修饰全局变量
  • static 修饰函数
3.1,static修饰局部变量

  实例:

#include void test(){int i = 0;i++;printf("%d ", i);}int main(){int i = 0;for (i = 0; i < 10; i++){test();}return 0;}

  输出结果:


static修饰后:

  实例:

#include void test(){static int i = 0;//static修饰局部变量i++;printf("%d ", i);}int main(){int i = 0;for (i = 0; i < 10; i++){test();}return 0;}

  输出结果:


  综上分析:static修饰局部变量时,实际改变的是局部变量的存储位置,本来局部变量是应该放在栈区位置的,但是被static修饰后则被放在静态区了,从而导致,局部变量变成了静态的局部变量,出了作用域依然存在,生命周期并未结束,下次进入函数依然存在。


讲到这里,来简单介绍一下简化后的内存:

注:静态区的生命周期和程序的生命周期是一致的,程序结束,静态区的数据生命周期也就结束。


3.2,static修饰全局变量

  实例:

  输出结果:


static修饰全局变量后:

  实例:

  输出结果:


综上分析:一个全局变量具有外部链接属性,但被static修饰后,全局变量的外部链接属性就变成了内部链接属性,只能在所在的源文件内部使用,不能在其他文件内使用。


3.3,static修饰函数

  实例:

  输出结果:


static修饰函数后

  实例:

  输出结果:

  综上分析:一个函数具有外部链接属性,但被static修饰后,全局变量的外部链接属性就变成了内部链接属性,只能在所在的源文件内部使用,不能在其他文件内使用。(与static修饰全局变量相类似) 。


4,补充关键字之register

register:寄存器关键字,建议将变量,函数存储在寄存器中

电脑上的存储设备示意图:

  • 寄存器是集成到CPU上的

  • 早期:CPU数据从内存上读取,CPU处理数据

  • 现在:1.CPU数据处理过快,内存读写速度跟不上,组成CPU数据闲置
    2.CPU数据从寄存器中读取数据,避免CPU数据闲置


由此返回目录

二,define定义常量和宏

1,define定义常量

格式:#define + 标识符 + 常量

  实例:

#include//定义标识符常量#define MAX 100int main(){printf("%d", MAX);return 0;}

  输出结果:


2,define定义宏

  实例:

#include//定义宏#define ADD(x,y) ((x)+(y))int main(){int sum = ADD(2, 3);printf("%d", sum);return 0;}

  输出结果:

  分析:


由此返回目录

三,指针

1,内存

1,内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。

2,为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节

3,为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址


2,变量地址

变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。

  取出单元地址:

#include int main(){int num = 10;&num;//取出num的地址printf("%p\n", &num);//打印地址,%p是以地址的形式打印return 0;}

  输出结果:

  注意:这里num是4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)。


3,指针变量

指针变量:用来存放指针(地址)的变量

  示例:

#include int main(){ int num = 66; int *p; //p为int型指针变量 p= &num; return 0; }

4,指针的使用

#include int main(){int num = 10;int* p = &num;*p = 20;printf("%d",num);return 0;}

  输出结果:


5,指针的大小

指针变量的大小取决于地址的大小

32位平台(X86)下地址是32个bit位(即4个字节)

64位平台X64)下地址是64个bit位(即8个字节)

  示例:

#includeint 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语言有能力描述复杂类型。

比如描述一名学生,学生包含: 名字+年龄+性别+学号 这几项信息。

这里只能使用结构体来描述了。

1,认识结构体

  示例:

struct Stu{char name[20];//名字int age;//年龄char sex[5];//性别char id[15]; //学号};

2,初始化结构体

  示例:

//打印结构体信息struct Stu s = {"张三", 20, "男", "20180101"};

3,输出结构体数据

  • .为结构成员访问操作符:结构体变量.结构体成员
  • ->操作符:结构体指针->结构体成员

  示例:

//.为结构成员访问操作符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);

4,结构体的综合使用

  示例:

//学生struct Stu{//成员char name[20];int age;char sex[10];char tele[12];};void print(struct Stu* ps){printf("%s %d %s %s\n", (*ps).name, (*ps).age, (*ps).sex, (*ps).tele);//->//结构体指针变量->成员名printf("%s %d %s %s\n", ps->name, ps->age, ps->sex, ps->tele);}#includeint main(){struct Stu s = {"zhangsan", 20, "nan", "15596668862"};//结构体对象.成员名printf("%s %d %s %s\n", s.name, s.age, s.sex, s.tele);print(&s);return 0;}

  输出结果:


结语

各位小伙伴们,(入门篇)初识C语言(下)就将C语言后续要学的内容介绍完了,小伙伴们再看后,应该对C语言有了大致的了解了吧!!!下面我将对这些知识点进行逐一详细讲解,敬请期待!

如果各位小伙伴们感觉写的不错,或者阅读后有些许收获的话,麻烦小伙伴们动动你们的小手,给个三连呗(✌关注,✌点赞,✌评论),多多支持一下!!
小伙伴们,切记!这些示例代码一定要记得自己实际操作一下,这样才能加深对这些知识的理解!

最后,感谢每一位小伙伴的阅读,让我们一起努力,一起加油,一起进步!

为了小伙伴能够有更好的阅读体验,在此附上前两篇博客链接:
【小杨带你玩转C语言】(入门篇)初识C语言(上)
【小杨带你玩转C语言】(入门篇)初识C语言(中)