【从0到1手把手带你学C语言】初始C语言3

文章目录

  • 前言
  • 1. 操作符
    • 1.1 优先级
  • 2. 常见关键字
    • 2.1 typedef关键字
    • 2.2 static关键字
      • 2.2.1 修饰局部变量
      • 2.2.2 修饰全局变量
      • 2.2.3 修饰函数
      • 2.2.4 总结
  • 3. #define定义的常量宏
  • 4. 指针
    • 4.1 内存
    • 4.2 指针
    • 4.3 指针变量
    • 4.4 指针变量的大小
  • 5. 结构体
    • 5.1 结构体的创建
    • 5.2 引用结构体
  • 最后

前言

本章内容是初始C语言的最后一节,后续会逐一创作更详细的文章

1. 操作符

本节简单介绍几种操作符,后续会出文章细说
操作符可以分为以下几类:
【从0到1手把手带你学C语言】初始C语言3_第1张图片

1.1 优先级

【从0到1手把手带你学C语言】初始C语言3_第2张图片

算术运算符中/%值得注意
/如果两个操作数都是整数,那么结果是两个整数相除的商,比如6/5=1
想要得到小数,两操作数至少有一个是小数,6.0/5=1.2
%两操作数必须是整数,结果为两数相除后的余数,
余数符号和分子相同
(-3) % 5 = -3
3% (-5) = 3 
单目运算符中的++前置和++后置注意区分(--类似,以++举例)
#include
int main()
{
	int a = 2;
	int b = a++;
	printf("%d\n", b);//2
	printf("%d\n", a);//3
	a = 2;
	b = ++a;
	printf("%d\n", b);//3
	printf("%d\n", a);//3
	return 0;
}
前置++表示先自增,在引用
后置++表示先引用,在自增

注:[] . ->操作符在本文后续会介绍,与位有关的操作符后面会出文章细说


2. 常见关键字

前面我们介绍变量时说过变量的命名不能用关键字,那么C语言都有哪些关键字呢?
C语言常用的关键字有

数据类型:
1.内置类型:char short int float long double ,long long ,long double,void
2.构造类型:enum ,struct,union
3.其他:const extern signed unsigned
存储类型:auto static register
循环:while do for continue break 
选择:if else switch case default break 
特殊:sizeof return goto typedef volatile

2.1 typedef关键字

typedef亦为类型定义,也可以称类型重定义,类型替换

当某种类型名比较复杂,用typedef可以简化类型名称

【从0到1手把手带你学C语言】初始C语言3_第3张图片

通常用typedef重定义结构体类型

【从0到1手把手带你学C语言】初始C语言3_第4张图片


2.2 static关键字

在C语言中:
static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数

2.2.1 修饰局部变量

改变局部变量的生命周期
无static定义
【从0到1手把手带你学C语言】初始C语言3_第5张图片
static定义
【从0到1手把手带你学C语言】初始C语言3_第6张图片

说明static修饰局部变量改变变量的生命周期,离开test函数时a不会销毁。
所以下次调用test函数时不会创建变量a,更不会初始化。

2.2.2 修饰全局变量

无static定义
【从0到1手把手带你学C语言】初始C语言3_第7张图片
static定义
【从0到1手把手带你学C语言】初始C语言3_第8张图片

报错为无法解析g_val
说明此时全局变量不具有外部链接属性

2.2.3 修饰函数

无static定义
【从0到1手把手带你学C语言】初始C语言3_第9张图片

static定义
【从0到1手把手带你学C语言】初始C语言3_第10张图片

可以看出来 static修饰函数使函数只能在当前的源文件中引用该函数

2.2.4 总结

1.修饰局部变量,改变局部变量的存储方式(栈存储变为数据段存储),体现为生命周期变长
2.修饰全局变量,改变全局变量的链接属性(外部链接变为内部链接),体现为作用域变小
3.修饰函数,改变函数的连接属性(外部链接变为内部链接)只能在定义函数的源文件中引用函数

附C和指针里的总结
【从0到1手把手带你学C语言】初始C语言3_第11张图片


3. #define定义的常量宏

本届内容仅仅简单的介绍一下宏定义,后期会出详细的文章与大家探讨

#define MAX 100 //定义常量

我们定义加法函数可以这么写

int add(int a, int b)
{
return a + b;
}

int main()
{
int a = 10, b = 20;
int ret = add(a,b);//运行的时候会进入函数内部并且带出返回值
printf("%d", ret);
return 0;
}

如果我们定义宏可以这么写

#define ADD(a,b) ((a)+(b)) //一定要加括号
int main()
{
int a = 10, b = 20;
int ret = ADD(a,b); //编译的时候就直接将ADD(a,b)替换成((a)+(b))
pritnf("%d", ret);
return 0;

总结:

1.函数调用会进入函数内部并且返回值,函数调用程序运行时才会执行
2.宏定义是替换,宏定义在编译的时候就会进行

4. 指针

在熟悉指针之前我们先来说一下内存

4.1 内存

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

【从0到1手把手带你学C语言】初始C语言3_第12张图片
任务管理器中可以看见每个程序对内存的占用有多少,当程序运行时,会向内存中申请存储空间存储程序运行所需要的相关数据。
打个比方,每一个房间都需要空间,而公寓给了每个房间所需要的空间,内存就相当于公寓,房间相当于各种各样的数据,数据不同,所占用的空间不同,这也是不同程序所占用内存不同的原因

常见的内存有4G ,8G ,16G ,32G

现在我们知道,内存是存放数据的
每个房间都是独立的,用隔板将它们分开,并且每个房间都有门牌号,以便我们可以找到对应的门户,因此,对于内存

1.内存首先被划分为一个个的内存单元
2.内存单元有编号

针对结论1,每个内存单元占多大空间?
每个内存单元占1字节
解释
我们知道存储容量单位有bit-->byte-->kb-->Mb……而占存储容量最小的数据类型是char 需要8bit位,如果选择bit最为内存单元,而每一个内存单元对应一个编号,一个char就需要8个编号,过于浪费,如果选择一个kb为内存单元,那么一个内存单元将可以存放1024个char数据,但是只有一个编号,所以编号和数据不能一一对应,综上,选择1byte为内存单元最合适。
针对结论2,内存单元是如何编号的?
内存单元的编号是从32个0到32个1(32位)
解释
32位机器上,有32根地址线
【从0到1手把手带你学C语言】初始C语言3_第13张图片
每根地址线在通电情况下有高电频和低电频两种状态,所以32根地址线全部通电情况下有2^32种状态,分别是
【从0到1手把手带你学C语言】初始C语言3_第14张图片
因而我们将2^32种通电状态作为内存单元的编号

32位机器最大内存为4G,理由如下:
32位机器的内存单元编号最多有2^32种,即内存最多有2^32个小单元
,而每一种编号对应的内存单元占一个字节,所以内存共占2^32byte,
1KB=1024byte,1MB=1024KB,1GB=1024MB,2^32字节刚好就是4GB
同理64位机器内存最大为8GB

内存单元的编号等于地址等于指针


4.2 指针

指针就是地址,地址就是指针
我们现在来看程序运行时是怎么使用内存的

#include
int main()
{
int a = 10;
return 0;
}

【从0到1手把手带你学C语言】初始C语言3_第15张图片

我们调式一下看一下内存的分布
内存编号和数据内容均是十六进制显示
【从0到1手把手带你学C语言】初始C语言3_第16张图片
我们再来看一下a的地址

a占4个字节 我们打印a的地址 屏幕上显示00EFFE08,
说明a的地址是第一个字节的地址

4.3 指针变量

a中存放的是整数,我们称a为整形变量
&a是一个指针,所以我们将存放指针的变量称为指针变量

【从0到1手把手带你学C语言】初始C语言3_第17张图片

【从0到1手把手带你学C语言】初始C语言3_第18张图片

指针变量具有指向性

pa中存放的是a的地址,所以我们可以通过pa找到a,相当于我知道你家地址,我就可以找到你

int * pa
*说明pa是指针变量
int说明pa所指向的对象是int类型

如何通过pa找到a?

*pa = 20//*是解引用操作符,表示通过pa找到pa所指向的a
同理,指向字符的指针这么定义

【从0到1手把手带你学C语言】初始C语言3_第19张图片

4.4 指针变量的大小

前面我们使用sizeof求过基本数据类型的大小,那么指针的大小是多少呢?
【从0到1手把手带你学C语言】初始C语言3_第20张图片
我们发现指针在32平台上的字节数都是4个字节
这是为什么呢?

指针变量存储的值是地址,而前面说过内存单元的编号取值为320321,
即指针的取值为32032132个二进制刚好是4个字节
对于64为平台,64根地址线,指针取值为640641,占8个字节

【从0到1手把手带你学C语言】初始C语言3_第21张图片

总结:
-` 变量的地址是变量占据的第一个字节地址

  • 指针是内存中的一个存储单元,编号由32/64个0、1组成
  • 指针变量的字节数仅仅取决与平台的位数`

5. 结构体

前面我们已经了解了C语言的基本类型

int,char,short,long,long long,float,double,long double 
指针类型等

但是上述类型具有单一性,只能用来定义只具有一种性质的个体,这是不够的,对于描述一个学生,我们不能用上述基本类型的任意一个来定义,因为学生具有性别、年龄、学号等多个性质,因而,我们创建了自定义数据类型,结构体就是其中一种

5.1 结构体的创建

struct Stu  //创建了一种类型,该类型属于自定义类型中的结构体类型,该类型名叫struct Stu
{
 char name[20];
 int age;              //{}内的所有变量称为结构体成员,也叫做域
 char sex[5];
 char id[15];
}
struct Stu student1 = {"小红",10,"女","12345"};
//表示用该类型定义了一个变量并初始化

5.2 引用结构体

对于结构体等有两个专属操作符,分别是->和.
例如,student1过生日了,年龄增加了一岁,可以这么表示

student1.[age] = student1.[age] + 1; 
//student1表示找到需要引用的结构体变量,操作符.表示找到该变量的某个成员
找到age成员并且让它加一

当我们不知道结构体变量的名字时,但是直到它的地址

struct Stu* ps = &student1;
ps->age = ps->age + 1; //等价*(ps).[age]
操作符->的做操作数是针对指针,表示找到地址值为ps的变量,->表示找到该变量的某个成员

最后

初始C语言1
初始C语言2
初始C语言3
三篇文章已经将C语言的知识点粗略的介绍的一遍,后续的文章会逐一针对每章内容进行更深入、详细的讨论,如果您觉得哪里写的有问题,欢迎指正!
最后:如果您觉得文章对您有帮助,请不要吝啬手中的赞,这对我来说很重要,也是我继续创作的动力,谢谢!

你可能感兴趣的:(C语言,c语言,c++,算法)