【从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-创新互联
新闻来源:https://www.cdcxhl.com/article22/djdojc.html

成都网站建设公司_创新互联,为您提供关键词优化网站营销自适应网站静态网站网站设计域名注册

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

外贸网站制作