【从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 引用结构体
  • 最后

创新互联提供成都网站制作、成都做网站、网页设计,品牌网站设计广告投放平台等致力于企业网站建设与公司网站制作,10余年的网站开发和建站经验,助力企业信息化建设,成功案例突破近1000家,是您实现网站建设的好选择.前言

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

1. 操作符

本节简单介绍几种操作符,后续会出文章细说
操作符可以分为以下几类:

1.1 优先级

在这里插入图片描述

算术运算符中/和%值得注意
/如果两个操作数都是整数,那么结果是两个整数相除的商,比如6/5=1
想要得到小数,两操作数至少有一个是小数,6.0/5=1.2
%两操作数必须是整数,结果为两数相除后的余数,
余数符号和分子相同
(-3) % 5 = -3
3% (-5) = 3
单目运算符中的++前置和++后置注意区分(--类似,以++举例)
#includeint 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可以简化类型名称

在这里插入图片描述

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


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

改变局部变量的生命周期
无static定义

static定义

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

无static定义

static定义

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

无static定义
在这里插入图片描述

static定义
在这里插入图片描述

可以看出来 static修饰函数使函数只能在当前的源文件中引用该函数
2.2.4 总结
1.修饰局部变量,改变局部变量的存储方式(堆存储变为数据段存储),体现为生命周期变长
2.修饰全局变量,改变全局变量的链接属性(外部链接变为内部链接),体现为作用域变小
3.修饰函数,改变函数的连接属性(外部链接变为内部链接)
只能在定义函数的源文件中引用函数

附C和指针里的总结


3. #define定义的常量的宏

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

#define MAX 100 //定义常量

我们想写a+b的函数可以这么写

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 内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的

在这里插入图片描述
任务管理器中可以看见每个程序对内存的占用有多少,当程序运行时,会向内存中申请存储空间存储程序运行所需要的相关数据。
打个比方,每一个房间都需要空间,而公寓给了每个房间所需要的空间,内存就相当于公寓,房间相当于各种各样的数据,数据不同,所占用的空间不同,这也是不同程序所占用内存不同的原因

常见的内存有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根地址线
的撒
每根地址线在通电情况下有高电频和低电频两种状态,所以32根地址线全部通电情况下有2^32种状态,分别是

因而我们将2^32种通电状态作为内存单元的编号

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

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


4.2 指针

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

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

我们调式一下看一下内存的分布
内存编号和数据内容均是十六进制显示

我们再来看一下a的地址

a占4个字节 我们打印a的地址 屏幕上显示00EFFE08,
说明a的地址是第一个字节的地址
4.3 指针变量
a中存放的是整数,我们称a为整形变量
&a是一个指针,所以我们将存放指针的变量称为指针变量

指针变量具有指向性

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

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

如何通过pa找到a?

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

```c
![
](https://img-blog.csdnimg.cn/fd503b17e5144efd9a6d302d94c0c797.png)

4.4 指针变量的大小

前面我们使用sizeof求过基本数据类型的大小,那么指针的大小是多少呢?

我们发现指针在32平台上的字节数都是4个字节
这是为什么呢?

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

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

  • 指针是内存中的一个存储单元,编号由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语言的知识点粗略的介绍的一遍,后续的文章会逐一针对每章内容进行更深入、详细的讨论,如果您觉得哪里写的有问题,欢迎指正!
最后:如果您觉得文章对您有帮助,请不要吝啬手中的赞,这对我来说很重要,也是我继续创作的动力,谢谢!

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站栏目:【从0到1手把手带你学C语言】初始C语言3-创新互联
文章出自:http://hbruida.cn/article/djdojc.html