十二.操作符
先大概给大家看看有哪几种,具体用法后面会有博客细讲的
十三.常见关键字
C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。
auto break case char const continue default do double else enum
extern float for goto if int long register return short signed
sizeof static struct switch typedef union unsigned void volatile while
选几个比较有用的讲讲,其他的后面有博客会讲的
1.typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名。
typedef的重命名其实和人一样,你可以把它理解为人的小名。比如有一个人叫张三,那么从小家里人可能叫他小三,但是这两种叫法的含义是一样的。
举例说明一下:
//将unsigned int 重命名为uint, 所以uint也是一个类型名 typedef unsigned int uint; int main() { //观察num1和num2,这两个变量的类型是一样的 unsigned int num1 = 0; uint num2 = 0; return 0; }
typedef的使用目的往往是使我们在编写代码时更加方便,如上面代码,写出uint是不是简单多了?
2.关键字static
在C语言中:static是用来修饰变量和函数的
1. 修饰局部变量—称为静态局部变量
2. 修饰全局变量—称为静态全局变量
3. 修饰函数—称为静态函数
修饰局部变量
//代码1 #include <stdio.h> void test() { int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for (i = 0; i < 10; i++) { test(); } return 0; } //代码2 #include <stdio.h> void test() { //static修饰局部变量 static int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for (i = 0; i < 10; i++) { test(); } return 0; }
让我们来对比一下代码1和2的运行结果
注意:
这里主函数中的i并没有传进test,它的目的只是让test执行十次。
代码1打印10个1的原因:
当打印完test中的i时,i由于是局部变量直接被销毁,再下一次执行test时又重新被初始化为0.
结论:
static修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
修饰全局变量
int year = 2023; 注意这里的两个year未放在同一个源文件中 int main() { extern year;//表明变量或者函数是定义在其他其他文件中的 printf("%d ", year); return 0; }
同样能运行,但当我们用static修饰一下
结论:
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
修饰函数
与修饰全局变量一样
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
这里不再缀叙
十四.#define 定义常量和宏
- define翻译为中文就是定义,在这里我们的#define就是给xxxxx下定义的意思。
define定义标识符常量
>#定义 标识符 内容 >#define name stuff
如下代码
//define定义标识符常量 #define MAX 1000 int main() { int a = MAX; printf("%d", a); return 0; }
也有类似typedef的用法
#define x int//用x这个名字代替int x main() { x m = 0; printf("%d", m); return 0; }
是不是很神奇呢?
define定义宏
#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏 (define macro)
宏的知识是在C语言进阶中的,我们后面也会讲到,这里只是认识它一下。
举个例子:
#define ADD(x, y) ((x)+(y)) #include <stdio.h> int main() { int sum = ADD(2, 3); printf("sum = %d\n", sum); sum = 10*ADD(2, 3); printf("sum = %d\n", sum); return 0; }
使用起来和函数差不多,但是却比函数看着更加简洁
十五.指针
接下来就是重中之重的指针啦,对于很多学过的人来说,指针是最令人头疼的。由于指针的内容繁且多,所以…(你应该知道我要说什么吧)。
本篇只讲下基础的指针,剩下的内容放在初阶指针以及进阶指针中。
俗话说基础不牢地动山摇,因此这里也要好好看并理解哦!
1.内存及指针定义
讲指针前我们得先知道内存是什么
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址
在C语言中,我们把这个地址就叫我们的指针
有些人可能会问了,这个地址是哪来的,又是怎么编号的呢?该不会是我胡诌的吧?
接下来咱们就讲讲
地址与地址编号的由来
在计算机上,有地址线,其中电线的高低电平的信号,转换为数字信号:1/0
在32(64)位机器,上面有32(64)根地址线
二进制,由于有32根地址线,所以一共有2的32次方个字节的空间,也就产生了这么多的编号。
这就是地址以及其编号的由来
变量在内存中的存储
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
#include <stdio.h> int main() { int num = 0; #//取出num的地址 //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址) printf("%p\n", &num);//打印地址,%p是以地址的形式打印 return 0; }
那变量的地址如何存储,需要定义指针变量。
2.指针变量
- 指针变量的意思就是一个存放指针(即地址)的变量
#include <stdio.h> int main() { int num = 0; int* pa = #把取到的num的地址放到一个指针变量pa里 printf("%d", *pa); return 0; }
指针变量的应用
#include <stdio.h> int main() { int num = 0; int* pa = #把取到的num的地址放到一个指针变量pa里 printf("%d", *pa); return 0; }
可见num和*pa两者的结果相同
我们也能通过*pa改变num的值
3.指针变量的大小
上面我们在内存中讲了内存空间的大小,空间有多大自然就有多大的地址,也就是有多大的指针。
用代码测试一下:
#include <stdio.h> //指针变量的大小取决于地址的大小 //32位平台下地址是32个bit位(即4个字节) //64位平台下地址是64个bit位(即8个字节) int main() { printf("%d\n", sizeof(char *)); printf("%d\n", sizeof(short *)); printf("%d\n", sizeof(int *)); printf("%d\n", sizeof(double *)); return 0; }
我的电脑是64位平台,因此指针的大小为8个字节
总结:
32位平台下地址是32个bit位(即4个字节)
64位平台下地址是64个bit位(即8个字节)
十六.结构体
该说恭喜还是总算到了最后一章了呢?结构体的知识对于初学者来说也比较难懂,如果这里讲的太深,对于初学者来言,很容易直接从C语言入门到入土,所以咱们这里也还是只简单介绍一下,等之后有了更多的知识后我会写专门的博客来攻克它。
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。
这里只能使用结构体来描述了。
代码如下
struct stu { char name[10];//名字 int age;//年龄 char sex[5];//性别 char id[20];//学号 }; int main() { struct stu s = { "张三",20,"男","211540239" }; //其中"."为结构成员访问操作符 printf("%s %d %s %s\n", s.name, s.age, s.sex, s.id); struct stu* ps = &s;//把s的地址存放在结构体指针ps里,通过地址指向s中的值 //->操作符 printf("name = %s age = %d sex = %s id = %s\n", ps ->name, ps->age, ps->sex, ps -> id); }
总结
如果你有耐心能从上篇开始看到这里,那么我相信此刻你一定对C语言有了一个新的认识。
正如我在文章中一直提到的,以上的部分只是基础的介绍,如果你感兴趣的话,后面还会有每一部分的具体介绍博客和C语言进阶的知识。让我们一起努力,共同进步。去实现自己的梦想与抱负吧!!
以上就是今天要将的所有内容了,如果有任何疑问欢迎在评论区提出或者私信我。
写一篇这么长又这么系统的博客真的很艰难,其中我查阅了大量的资料以及自己上手写了数千行代码,博客中出现的所有解释用的图片也都是我手绘的。
制作不易,如果你觉得对你有所帮助的话,请三连支持一下这个努力的新人博主吧。