typedef关键字的用法
typedef
是C语言中的一个关键字,其主要作用是为现有的数据类型创建一个新的名称,即定义类型别名。这种机制使得程序员能够为复杂或冗长的类型声明定义简短、易读且具有描述性的别名,从而提高代码的可读性和可维护性。
typedef变量与结构体重命名
#define _CRC_SECURE_NO_WARNINGS
// 把 unsigned int重命名为 uint
typedef unsigned int unit;
// tyepdef 给结构体重命名
typedef struct Node {
int data;
struct Node* next;
}Node;
int main() {
unsigned int num = 0;
// 以上两个变量是等价关系
unit num2 = 1;
// 重命名
struct Node n;
// 与上面的结构体也是等价关系
Node n2;
return 0;
}
static关键字的用法
static 关键字修饰局部变量
未使用static修饰的局部变量int a = 1 这个时候“局部变量的生命周期:局部变量的生命周期是进入局部变量的范围内创建,出了局部变量的范围内销毁”,程序从main函数开始执行,执行到while循环时判断i的值小于10,调用test函数,test函数创建int类型的局部变量a赋值为1,然后执行a++,这个时候a的值为2,然后出test函数,这个时候局部变量a已经被销毁,a的值已经恒定为2,这个时候主函数再次调用10次的test函数并将程序的结果打印输出,得到的结果就是10个2.
#define _CRC_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
// 局部变量的生命周期是进入它的范围创建,出它的范围销毁
void test() {
int a = 1;
a++;
// 打印输出的结果是10个2
printf("%d",a);
}
int main() {
int i = 0;
// 函数循环调用10次
while (i < 10) {
test();
i++;
}
return 0;
}
static 关键字修饰局部变量
static关键字修饰局部变量,局部变出了函数的作用域之后不会被销毁,static关键字的作用是改变局部变量的存储位置,存储位置的改变影响变量的生命周期,static修饰的变量和程序的生命周期是一致的“即程序什么时候运行结束被销毁,static修饰的静态变量就什么时候被销毁”,局部变量原先是存储在栈中的 【栈的存储特点是进入变量的作用域被创建,出了变量的作用域被销毁】,而使用static关键字修饰的变量存储位置是在静态区中【静态区中变量的生命周期-->程序被销毁的时候才会被销毁】,【静态变量和全局变量在编译期间编译器已经给其分配了地址空间,是不会拥有对应的汇编代码的--------> 这里可以参考debug反汇编】。
#define _CRC_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
// 局部变量的生命周期是进入它的范围创建,出它的范围销毁
void test() {
// static 修饰A之后A出了函数的范围没有被销毁,然后值会累计++
static int a = 1;
a++;
// 打印输出的结果是10个2
printf("%d ",a);
}
int main() {
int i = 0;
// 函数循环调用10次
while (i < 10) {
test();
i++;
}
return 0;
}
static修饰局部变量,局部变量出了作用域是不会被销毁的,“本质上static修饰局部变量改变了变量的存储位置”
局部变量的存储原理
void关键字的用法
void关键字的含义
在创建函数时,一些情况下需要有返回值,使用void的方式创建函数表示该函数只需要执行相关的操作即可,无需返回值。“使用void关键字修饰的函数适用于没有返回值的情况”
void test() {
printf("no back");
}
static修饰全局变量
extern 关键字用于声明外部符号,变量在外部的C语言文件声明后想要在本文件中使用这个变量必须要使用extern关键字对外部的变量进行声明“声明:表示告诉通知的意思”。
以上创建了两个C语言源文件,在一个名为"test.c"的文件中声明一个外部的全局变量,并在main.c文件中使用这个全局变量,这个时候需要使用extern关键字对外部的全局变量进行声明,不然会出现错误ERROR。
在外部变量中加上static关键字进行修饰后,使用外部的extern 声明没办法使用外部的全局变量,全局变量的特定“全局变量具有链接属性”全局变量具有外部链接属性,但是如果加上static修饰的全局变量的时候全局变量的外部链接属性会变成内部链接属性,这个时候“源文件.c”就不能在使用到全局变量,【也就是static修饰全局变量会改变全局变量的链接属性,使得全局变量的外部链接属性变为内部链接属性让.c文件不能被其他的.c文件使用,但是这个变量在自己的源文件中还是可以正常使用的】,我们在使用的时候就感觉作用域是变小了,也就是外部的链接属性变成内部链接属性 。
此时编译器运行出行错误
static修饰外部函数
函数本来是具有外部链接属性的,但是被static修饰之后,外部链接属性变成了内部链接属性,其他源文件(.c)为后缀的源文件就无法使用这个函数了 “实际上和外部的全局变量性质是一样的”。
要引用外部文件创建的全局函数需要将static关键字的修饰去掉,去掉static关键字的修饰后程序运行结果。
寄存器关键字的用法
register关键字
register 关键字,在c语言和c++的语法中用于声明寄存器变量,表示“建议寄存器优先处理”,
register int num = 3; // 建议变量放到寄存器中访问的速度越快
计算机存储架构
register -----寄存器关键字,一个电脑上的存储空间,硬盘,内存,高速缓存,寄存器等。
宏定义的使用define
使用define定义常量
#include <stdlib.h>
#define NUM 300
int main() {
printf("%d\n", NUM);
int n = NUM;
printf("%d\n",n);
int arr[NUM] = { 0 };
return 0;
}
使用define定义宏
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM 300
// define 定义宏,名字是ADD(x,y),x + y 是宏的参数
#define ADD(x,y) ((x)+ (y))
int main() {
int a = 10;
int b = 20;
int c = ADD(a, b);
printf("%d\n", c);
return 0;
}
宏定义的本质:
宏定义的本质是替换,具体参考下图
......