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; }
最后简单提一下 栈区存储习惯先高地址后低地址