关键字
C语言预留给自己的一些特殊符号,有特殊的意义。这些符号被称为关键字。关键字很多,我们介绍一些常见的关键字,并且给它们分类。特别强调,程序员不能自己创造关键字!
分类:
接下里我们简单介绍两个关键字typedef和static
typedef
typedef顾名思义是类型定义,这里可以理解为类型重命名。
#include<stdio.h> typedef unsigned int uint; int main() { unsigned int num1 = 0; //此时你觉得unsigned int这个类型太长了 //你想简化所以可以使用typedef重定义 uint num2 = 0; //此刻num1和num2相同 return 0; }
static
在C语言中:static是用来修饰变量和函数的,静态的。这里,讲解三种用法。
1.static修饰局部变量
2.static修饰全局变量
3.static修饰函数
static修饰局部变量
那能延长i的生命周期吗,如果我们不希望i每次都被重新创建,i的值初始值一直是1的话?
当然可以利用static!
解释如下:
//这时的局部变量就是静态的局部变量 //一个普通的局部变量进入函数创建,出函数销毁 //但是static修饰之后,进入函数时已经创建好了,出函数的时候也不销毁。 //主观的感受:生命周期变长了,但是作用域不变,只能在局部范围内使用。 // //本质:普通的局部变量是放在栈区上, //但是被static修饰之后,是存放在内存的静态区, //静态区的变量生命周期和全局变量生命周期一样长。
本质:
static修饰全局变量
全局变量可以跨文件使用,用extern。那加上static呢?
解释如下:
//int c = 2023; //全局变量是具有外部链接属性 //这种属性决定了全局变量在多个文件之间可以互相使用 //static int c = 2023; //static修饰全局变量的时候,将外部链接属性变成了内部链接属性 //c只能在当前的.c文件内部使用,不能在其他的.c文件使用了, //即便其他文件使用了extern外部声明也不行 //给我们主观感受:改变了作用域 //本质:无论加于不加static,全局变量均存在于静态区, //编译器在语法层面增加了限制
static修饰函数
加上static后和修饰全局变量有异曲同工之处。
解释如下:
//static修饰函数 //函数也是具有外部链接属性的 //这种属性决定了函数是可以跨文件使用的 // //int Add(int x, int y) //{ // return x + y; //} //static修饰函数是把函数的外部链接属性改成了内部链接 //使得函数只能在自己所在的.c文件里使用 //即便有extern也不行 static int Add(int x, int y) { return x + y; }
#define定义常量和宏
在前面我们学习了#define定义常量:
接下来我们将认识到#define定义的宏
#define定义的宏可以有参数和替换。
指针
关于指针,在初识C语言中,我们只需要知晓指针是什么?在介绍指针前,我们需要一些关于内存的预备知识,
内存
我们先看下电脑大致构成:
内存的管理 \划分
我们需要将硬盘的数据放入内存,又将内存的数据放入cpu,取出或者进行计算等等。那我们怎样去管理内存这块空间呢?这里我们类比我们需要在一栋大楼某个房间找到某个人,那我们怎样快速去找到这个人呢?找门牌号即可,也就是地址。
同理,我们对内存里的空间进行分割,编号。
内存空间为了有效的进行管理
1.把内存划分为一个个有效的内存单元(一个字节)
2.给每个内存单元编号形成→地址
C语言中把地址也叫指针
!内存单元编号=地址=指针
这样,未来,只要指定了一个地址,通过地址就能找到对应的内存单元。
关于计算机单位:比特位bite——二进制0/1 字节byte——字节 KB MB GB TB PB
最适合一个有效内春单元的是字节。
内存的访问
访问内存首先我们得有地址,有了地址才能访问内存单元,地址从哪里来呢?——地址线
所有地址:
一个地址管理一个字节。
那2^32总共能管理多大的内存空间?——2^32字节
那是多大呢? 换算得到4GB
综上所述:我们可以知道内存中物理的地址线产生地址信号,然后产生传出地址序列之后,可以利用序列在内存中找到一个对应空间。
举例
我们在编译器内存 窗口看到的是十六进制表示方法,为了看起来更直观清晰。
但是内存中存储中仍是二进制。
&a是取首地址,后面都是连续。
&a拿到较小字节的地址
指针符号
&——取地址操作符。
int* pa=&a;
*——pa是指针变量。
int——pa指向的是int类型的变量。
*pa
*——解应用操作符——通过地址找到地址所指向的对象。
指针大小
在32位的环境下:
在64位的环境下:
指针变量是用来存放地址的
指针变量的大小,就取决于存放一个地址需要多大的空间
在32位的环境下:
一个地址大小是32bit位,需要4个字节。所以不管什么类型的指针变量,大小都是4个字节。
在64位的环境下:
一个地址大小是64bit位,需要8个字节。所以不管什么类型的指针变量,大小都是8个字节。
综上:指针大小在32位平台是4个字节,64位平台是8个字节。
补充和总结
补充
1.编号=地址=指针
2.指针变量:存放地址的变量
//无论你放入什么到指针变量当中去,它都会当作一个变量
#include<stdio.h> int main() { int* pa=5; //放入一个5,指针pa也会把5当作地址 return 0; }
3.口头语中说的指针:一般指的是指针变量。
总结
1.内存会被划分以字节为单位的一个个的内存单元
2.每个内存单元都有编号,编号 = 地址 = 指针
3.C语言中创建的变量,其实是向内存中申请一块空间,比如:int a =10,就是向内存申请4个字节,每个字节空间都有地址。
4.&a的时候,拿出的是4个字节中的地址较小的字节地址(编号)
5.这个地址要存储起来,给一个变量,这个变量是用来存放地址(指针),所以叫指针变量:int *pa =&a;
6.pa中存放的是a的地址,要通过pa中的地址找到a,怎么写?*pa
通过pa中的地址找到a *pa = 20;//本质是修改a
7.指针符号
8.指针大小在32位平台是4个字节,64位平台是8个字节。
结构体
创建结构体
struct Stu { char name[20]; int age; float score; };//不要漏掉分号
结构体的初始化
int main() { int num; struct Stu s1 = { "学生1",20,88.0f }; struct Stu s2 = { "学生2",18,65.5f };//初始化 printf("%s %d %f\n", s1.name, s1.age, s1.score); return 0; }
访问结构体
//访问结构体两种方法 //第一种:.为结构成员访问操作符 printf("%s %d %f\n", s1.name, s1.age, s1.score); //第二种:->操作符 struct Stu* ps1 = &s1; printf("%s %d %f\n", ps1->name, ps1->age, ps1->score);
访问结构体有两者方式:
1. .为结构成员访问操作符
2.->操作符
最后,感谢大家的阅读,欢迎大家指正不足和错误!下一篇我们将进入初级C语言!
关于一些代码和思维导图博主放在我的gitee帐号了,欢迎大家去关注。谢谢!
【gitee:https://gitee.com/TSQXG/c.start】
【邮箱:2784139418@qq.com】