常识

1. 全局变量的作用域

全局变量的作用域就是整个工程

我们在同一工程但在不同的源文件这句话是否有误呢?

比如在源文件 test2.c 中我们创建一个全局变量 a = 10

int a = 10

但在不做声名的情况下我们却发现在test1.c中 a 并没有被创建

int main() { printf("%d", a); // error return 0; }

但是全局变量的作用域是整个工程这句话并没有错误

我们只需要在 test2.c 中声明即可

此时我们需要一个函数 extern 使用方法如下

extern int a; int main() { printf("%d", a); // error return 0; }

2. 什么是常量

创建数组时我们需要为数组提供 创建量(必须为常量)

int main() { int a = 10; int arr[a] = { 0 }; // error : a return 0; }

const

const在 * 前 , 修饰的是 *p const在 * 后 , 修饰的是 p

const 只是将 a 从变量修饰成了常量,让其拥有了常属性,但其本质上还是一个变量

const int a = 10; a = 20; //error 表达式必须是可以修改的左值 int arr[a] = { 0 }; //error, 其本质上还是一个变量

枚举常量

枚举常量即是可以一一列举的量

创建方法如下

enum xxx { a, //若不赋值默认为0 b, //向下逐一递增,b即默认为1 c = 100, //赋值之后即为100 d //逐一递增,默认为101 } d = 110; //error 并不能改变

3. 常见字符串的创建


常见的字符串创建有以下几种

char arr1[] = "abc"; //实际上该字符串共有4个元素,其末尾会自动补上'\0'作为终止标志 char arr2[] = {'a','b','c','\0'}; //以这种方式创建时必须手动补上 '\0'作为结束标志 char arr3[4] = "abc" //之所以要标有四个元素个数,是要为 '\0' 留有空间 char arr4[4] = {'a','b','c','\0'} char arr5[4] = {'a','b','c'} //此时不加'\0'也没有关系,剩下的元素自动默认为'\0'

那么,加入没有手动加入 '\0' arr2 是否会出问题呢,我们来使用 strlen 这个函数来验证一下

strlen

求长度方式就是计算出字符串 '\0' 前的字符个数(不包括'\0')

char arr[] = { 'a', 'b', 'c'}; printf("%d", strlen(arr)); //42(随机值)

可见没有手动加入 '\0' 之后该字符串的长度是随机值

4. 转义字符

当我们想要打印一个字符 ' 时会有错误

那么究竟该如何做才能打印出一些貌似有功能作用的字符呢 在此我们引出转义字符

转义字符作用
/'用于表示字符常量 '
/"用于表示一个字符串内的双引号
//用于表示一个反斜杠,防止被解释为一个 转义序列符(即 /n , /r 等解释方向)
/a警告字符,打印可发出蜂鸣声
/b退格符
/f进纸符
/n换行
/r回车
/t水平制表符
/t水平制表符
/v垂直制表符
/ddd(d表示随机数字)表示1~3个八进制数字(系统可以将他解读为十进制 比如 /130 系统可以将他解释为十进制的 88
/xdd(/x是头,d是随机数字)表示1~2个十六进制数字

5. static

static修饰局部变量,改变了局部变量的生命周期 ,本质上是改变了变量的存储类型(由栈区变为静态区) static也会使其修饰的全局变量只能在自己所在的源文件内使用,其他源文件不能使用

全局变量在其他源文件内可以使用的原因是其具有外部链接属性 但被static修饰后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了 static修饰函数时,也会使得函数只能在自己所在的源文件内部使用

6. goto

goto语句不能够跨越函数

void test() { flag: printf("aaa"); } int main() { goto flag; //此时的flag会报错出"未定义flag" return 0; }

6. 随机数(时间戳)的生成

rand

#include<stdilb.h> int rand(void);

该函数可以生成 0~32767 的整形数

但是,调用该数组生成的虽然确实是一个随机数,但是当你运行第二次时,这个随机数并没有发生变化

即第一次调用和第二次调用得到的值都是一样的

我们引入另外一个函数

srand

调用rand之前,我们需要调用srand来设置这个随机数的生成器

#include<stdlib.h> void srand(unsigned int seed);

但是当我们调用这个函数后并放入一个 unsigned int 整形数后会发现较上次不一样了 调用第二次却发现,数字还是没有变化

再引入一个库函数 time

time函数会返回一个时间戳,返回的时间戳是: 调用这个函数的那个时间点和计算机的起始时间之间的时间戳

#include<time.h> time_t time(time_t *timer); //time_t 本质上是一个整形

而srand需要的类型是 unsigned int 类型,那么强制转换一下

#include<stdlib.h> #include<time.h> int main() { srand((unsigned int)time(NULL)); int ret = rand(); //ret 即是我们需要的随机数 return 0; }

最后简单提一下 栈区存储习惯先高地址后低地址