[被static修饰的变量(静态变量)和全局变量的区别:都存放在静态区中,但静态变量的作用域还是在局部,全局变量的作用域是任意地方,两者生命周期相同,都是程序结束才销毁]
2.修饰全局变量 - 称为静态全局变量
(未使用static时:)
//add.c文件: //全局变量具有外部链接属性(可以被extern声明) //使用在其他源文件内部依然可以使用(方法要正确) int g_val = 2023; //test_4_10文件: //static 修饰全局变量 #include <stdio.h> //声明外部符号 extern int g_val; int main() { printf("%d\n",g_val); return 0; }
(使用static后:)
//add.c文件: //全局变量具有外部链接属性(可以被extern声明) //使用在其他源文件内部依然可以使用(方法要正确) static int g_val = 2023; //static修饰全局变量,改变了这个全局变量的链接属性, //由外部链接属性变成了内部链接属性 //内部链接属性:只能在源文件内部使用 //这个静态变量只能在自己所在的源文件内部使用,不能 //在其他源文件外部使用了 //test_4_10文件: //static 修饰全局变量 #include <stdio.h> //声明外部符号 extern int g_val; int main() { printf("%d\n",g_val); return 0; }
3.修饰函数 - 称为静态函数
(未使用static时:)
//add.c文件中: //static修饰函数和static修饰全局变量是一样的 int Add(int x, int y) { return (x + y); } //test.c文件中: //static 修饰函数 #include <stdio.h> //声明外部符号 extern int Add(int x, int y); //声明是告诉 函数名 参数名 返回值 int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int s = Add(a, b); printf("%d\n", s); return 0; }
(使用static后:)
//add.c文件: //static修饰函数和static修饰全局变量是一样的 //函数本身时具有外部链接属性的,但是被static修饰, //就变成了内部链接属性 //使得这个函数只能在自己所在的源文件内部使用, //不能再其他文件内部使用 static int Add(int x, int y) { return (x + y); } //test_4_10文件: //static 修饰函数 #include <stdio.h> //声明外部符号 extern int Add(int x, int y); //声明是告诉 函数名 参数名 返回值 int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int s = Add(a, b); printf("%d\n", s); return 0; }
*register -- 寄存器:
(register 仅仅时建议的作用,建议放在寄存器中,但是不是真的放在寄存器中,取决于编译器)
11.2--在循环中使用的关键字:
break
continue
do while
for
while
11.3--在循环分支中使用的关键字:
break
switch case
default -- 默认
if else
goto
11.4--有关数据类型的关键字:
char
double
float
int
long
short
void
11.5--修饰类型的关键字:
const -- 设置常属性
signed -- 有符号的
unsigned -- 无符号的
typedef -- 类型重定义
*typedef -- 顾名思义是类型定义,这里应该理解为类型重命名:
//typedef -- 类型重命名(可以理解成给类型起个别名) #include <stdio.h> typedef unsigned int u_int;//将 unsigned int 重命名为 u_int,末尾加;(分号) int main() { unsigned int num = 0; //这里定义num的字符类型有点长,可以用typedef来重命名这个类型 u_int num2 = 0; //运用重命名的字符类型 return 0; }
11.6--函数的返回关键字:
return -- 返回值
11.7--计算计算机变量/类型大小的关键字:
sizeof -- 单位是字节
11.8--void关键字:
void -- 设置函数的返回值
-- 函数的参数
-- 修饰指针
11.9--有关自定义类型的关键字:
enum -- 枚举类型
struct -- 结构体类型
union -- 联合体类型
11.10--volatile关键字(很少见)
12*define定义常量和宏:
define是编译器的预编译指令,是编译器实现的,不是C语言的内容,不是关键字。
12.1 -- define定义常量:
//#define 定义标识符常量: #include <stdio.h> #define M 100 //后面不用加;(分号) //这里 M 是一个符号,是个常量,不用分配地址,没有地址 // 在预处理时进行替换 //变量才需要存储起来,分配地址 int main() { int arr[M] = { 0 };//声明数组长度的值得时常量 int m = M;//使用符号进行赋值 printf("%d\n",sizeof(arr));// //数组长度为100,有100个元素,一个元素占4个字节 // 100 * 4 = 400 printf("%d\n",M); printf("%d\n",m); return 0; }
12.2 -- define定义宏:
//#define 定义宏: #include <stdio.h> //使用#define定义一个宏: #define ADD(x, y) ((x)+(y)) //ADD-->宏的名字 (x, y)-->宏的两个参数 ((x)+(y))-->宏的实现体 //函数: int Add(int x, int y) //int-->函数的返回类型 Add-->函数名 (int x, int y)-->函数参数 { // return x + y; //---->这三行是函数体 } // int main() { int a = 10; int b = 20; //调用宏,类似调用函数 int c = ADD(a, b); //编译时进行替换:int c = ((a)+(b)); //宏 和 函数:写的形式不一样,调用方式非常类似 printf("%d\n", c); //调用函数 int d = Add(a, b); printf("%d\n", d); return 0; }
13*指针(下次学):
14*结构体(struct):
结构体时C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型(类似Java中的类)。
比如描述学生,学生包含:名字+年龄+性别+学号这几项信息,这里只能使用结构体来描述了。
//结构体--学生 #include <stdio.h> #include <string.h> struct Stu { //学生的相关属性 char name[20];//名字-字符串,一个汉字是2个字符 int age;//年龄 char sex[5];//“男”、“女”、“保密” //最长:“保密”两个汉字4个字符 加一个 “\0”一个字符,最多5个字符 };//大括号{}后加分号 struct Book { char name[50];//书名 char author[10];//作者 float price;//价格 //结构体里定义的内容称为结构体的成员 }; int main() { struct Stu s1 = {"张三", 20, "男"}; //struct Stu整体是一个字符类型,s是一个变量 struct Book b1 = {"《C语言从入门到入土》", "C大师", 66.6f}; printf("%s %s %f\n",b1.name ,b1.author ,b1.price); //使用 .操作符 来访问 成员对象 //浮点数在内存中无法精确地保存,会丢失一些精度 return 0; }