【从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. 操作符本节简单介绍几种操作符,后续会出文章细说
操作符可以分为以下几类:
算术运算符中/和%值得注意
/如果两个操作数都是整数,那么结果是两个整数相除的商,比如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
同理,指向字符的指针这么定义
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