这篇是初识C语言的最后一章,会讲关键字,指针,结构
体的内容,讲的也是基础,点到为止。
常见关键字
auto break case char const continue default do double else enmum extern
float for goto if int long register return short signed sizeof static struct
switch typedef union unsigned void while
以上就是我们常见的关键字,关键字都是语言本身设定好的,用户是不能自己创建的。
下面我们先讲几个让大家认识一下
1.typedef
typedef我们可以理解为类型重定义
typedef unsigned int uint_32;//命名unsigned int 为unsit_32 int main() { unsigned int num = 0;//正常命名 unsit_32 num1 = 2;//重新命名 //unsigned就是无符号命名 return 0; }
上面代码中我们把 typedef unsigned int 命名成 uint_32,那么我们在下面函数就可以直接来命名变量,就像我们生活中叫别人小名一样,同一个人,不同名字,但是本质不变,这个就是typedef的作用
2 关键字static
在C语言中static修饰变量和函数
1.修饰局部变量-称为静态局部变量
2.修饰全局变量-成为静态全局变量
3.修饰函数-成为静态函数
修饰局部变量的时候
void test()//void 不需要返回值,所以没有return { int a = 5; a++; printf("%d\n", a); } int main() { int i = 0; while (i < 10) { test();//进入test i++; } return 0; }
我们可以看到上述代码输出的结果是十个6,当我们没进入test()的时候就创建一个变量a=5,然后a++之后输出6,退出test()函数的时候变量a销毁,在执行i++操作,反复循环10次
下面如果我们在int a=5前面加上static,我们看看它会怎么变化。
void test()//void 不需要返回值,所以没有return { static int a = 5;//静态变量 a++; printf("%d\n", a); } int main() { int i = 0; while (i < 10) { test(); i++; } return 0; }
我们可以看到打印的数字每次加一,说明我们在退出void函数的时候,a的变量并没有被销毁,(销毁的意思就是返回操作系统),而是被保留下来。只有在程序彻底结束的时候,a才被销毁。
这样说大家可能比较理解,我举个生活中的例子说明,当我加上static的时候就好比我们把钱放在银行,每次执行的时候就像我们去银行存钱,钱会在原有的基础上变多,这样解释大家可能比较容易理解。
总结:static修饰局部变量的时候,改变变量的存储类型,使得静态变量的生命周期变长了,直到程序结束的时候,生命周期才结束,变量才被销毁
static修饰全局变量的时候
全局变量具有外部链接的属性,所以在其他源文件也可以使用
但是如果我们在全局变量上加入static的话,改变链接属性,变成内部链接,此时这个静态变量只能在它所在的源文件内使用。
test.c
extern int ggb;//声明文件 int main() { printf("%d", ggb); return 0; }
add.c
int ggb=23 `![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/4304fd4d803042d79aade7a0da9a9c09.png) 在上面程序中我们可以看到程序可以被执行 当我们加上static的时候看看效果 test.c ```c extern int ggb;//声明文件 int main() { printf("%d", ggb); return 0; }
add.c
static int ggb=23
我们可以看到VS的报错 ,无法解析外部命令,说明int ggb=23不能在test.c中使用,被修饰的静态变量只能在自己的源文件中使用,感觉像是作用域变小了
static修饰函数
修饰函数和修饰全局变量特别相似,下面我们举例说明
test.c
extern int Add(int x,int y);//声明文件 int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int sum = Add(a, b); printf("%d", sum); return 0; }
add.c
int Add(int x, int y) { return x + y; }
上述代码可以运行,但是如果我们在函数Add上加上static的时候,就会出现和全局变量一样的结果
函数具有外部属性链接,被static修饰后就变成内部链接,只能在自己的源文件内使用
register
register又叫寄存器,我们可以这样理解,首先我们对电脑的处理的数据得有个理解
寄存器
缓存
内存
硬盘
网盘
以上就是电脑数据处理和存储的地方,越往上处理速度越来越快,但是空间也就小了,造价也高。寄存器和内存无关,是把数据处理到中央处理器上,是独立的存储设备。
int main() { register int num=0;//register仅仅是建议的的作用,当我们加上的时候 //会告诉编译器要这么做,但是编译器不一定会这么做 return 0; }
现在的编译器中,我们不加register,编译器也可能放入寄存器中,寄存器的特点就是处理速度快。
#define 定义常量和宏
1定义常量
#define M 100 int main() { int arr[M] = { 0 };//M是常量 printf("%d", M);//可以打印结果 return 0; }
2定义宏
#define add(x,y)((x)+(y)) //add是名字 xy是参数 ((x)+(y))是宏的实现体 int main() { int a = 3; int b = 4; int sum = add(a, b);//sum=a+b printf("%d", sum); return 0; }
大家只要认识上面那个是#define这是定义宏,后面我会仔细讲
指针
指针这个对于每个初学者来说都很难,我在这里也是和大家讲讲它的定义和初步认识,点到为止,后期我会仔细讲。
指针就是地址,是我们的内存地址,指针变量就是用来存放地址的变量,不同类型的指针变量所占的存储单元长度是相同的,但是他们存储数据的变量因数据的类型而不同,所占的存储空间长度也不同。
- 内存
我们电脑上有很多的应用和软件,这些软件运行起来都要内存,我们可以从任务管理器查看,按下ctrl+Alt+.(delete),下面来看看我的任务管理器
我们会发现他们运行的时候都需要内存,所以内存是重要的存储器,计算机的所有程序的运行都是在内存中运行
在电脑上为了有效的存储,计算机讲内存划分一个个小小的单元格,每个内存单元都是一个小小的字节,为了有效的的找到每个单元格位置,我们又给它进行编号,编号就是我们的地址
&是取地址,%p是打印地址
int main() { int a = 10;//a在内存中占四个字节 &a;//取出a的地址 printf("%p\n", &a);//打印a的地址 return 0; }
a在内存中占四个字节
编译器打印每次的内容不一样
int main() { int a = 0; int* pa = &a; *pa = 100;//重新定义a printf("%d", a);//打印a的值 return 0; }
最后结果打印的是100
我们可以这样理解上面的代码,举个最近很火的电视剧,我们想要打出的结果是高启强,那pa相当于老默,高启强如果想要吃鱼,他是不是要叫老默来帮他,而pa就有这样的作用,修改了a的值
- 2指针变量的大小
还是再一次强调指针的大小是相同的!!!!
指针是一种复合数据类型,指针变量内容是一个地址,因此指针可以表示系统的整个地址集合,在32位平台下一个指针变量是4个字节,也就是32位,而在64位的平台下,指针变量是8个字节,也就是64位,所以在不同的平台下指针才会不同,而在同一平台下指针变量大小是相同的
我们可以看到在64位下打印的是8个字节
int main() { printf("%zd\n", sizeof(char*));//sizeof计算字节大小 printf("%zd\n", sizeof(long*));//%zd是打印指针变量的大小,虽然用%d也可以,但是警告 printf("%zd\n", sizeof(float*)); printf("%zd\n", sizeof(double*)); printf("%zd\n", sizeof(int*)); return 0; }
- 结构体
结构体是自己创建的
比如一本书需要书名+作者+定价+日期
我们需要先了解一个关键字struct
struct是用来创建结构体的
#include<stdio.h> struct stu//创建一个学生的类型 { char name[20]; int age; char sex[5]; }; int main() { struct stu s1 = { "张三","18","男" };//结构体的创建和初始化 printf("%s %d %s", s1.name, s1.age, s1.sex);//输出 return 0; }
.是点操作符,用于结构变量
->是结构体指针
#include<stdio.h> struct stu { char name[20]; int age; char sex[5]; }; int main() { struct stu s1 = { "张三","18","男" }; //printf("%s %d %s", s1.name, s1.age, s1.sex); struct stu* pa = &s1; printf("%s %d %s", pa->name, pa->age, pa->sex);//还可以这样写 return 0; }
今天的分享就到这里结束,我们的初识c语言也就此结束,接下来分享的就是细讲C语言,请大家期待,我们一起加油努力。我们下次再见,谢谢大家。