目录
1.变量的作用域和生命周期
作用域
变量使用的范围
1. 局部变量的作用域是变量所在的局部范围。(如括号内)
2. 全局变量(不安全)的作用域是整个工程。在另外一个源文件使用就要extern(声明外部符号)关键字。
extern int a;
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2. 全局变量的生命周期是:整个程序的生命周期。
2.C语言中的常量分为以下几种:
字面常量
{
4;//整型字面常量
3.3;//浮点型字面常量
‘x’;//字符型字面常量
"abcdef";//字符串型字面常量
}
const 修饰的常变量
num本质上是个变量,但是具有了常属性,不能被修改
证明是变量:
num虽然被const修饰,具有了常属性,不能被修改,但是本质上还是变量,所以不能用来指定数组的大小。
C99中,引入了:变长数组的概念,变长数组的大小是可以使用变量来指定的,但是数据不能初始化。如:
#define 定义的标识符常量
#define后不加分号
枚举常量
枚举 - 关键字是enum
//声明一个表示性别的枚举类型
enum Sex
{
//下面三个符号是Sex这个枚举类型的未来可能取值
//下面三个符号就是枚举常量
MALE,
FEMALE,
SECRET
};
int main()
{
enum Sex s = FEMALE;//enum Sex枚举类型,定义了一个s,再用枚举常量进行赋值
return 0;
}
并且三个枚举常量有值
enum Sex
{
MALE,
FEMALE,
SECRET
};
int main()
{
printf("%d\n",MALE);//打印出0(默认取值)
printf("%d\n",FEMALE);//1
printf("%d\n",SECRET);//2
return 0;
}
要改变取值
enum Sex
{
MALE=6,
FEMALE,
SECRET
};
int main()
{
printf("%d\n",MALE);//打印出6
printf("%d\n",FEMALE);//7
printf("%d\n",SECRET);//8
return 0;
}
3.字符串和\0
C语⾔中如何表⽰字符串呢?使⽤双引号括起来的⼀串字符就被称为字符串,如:"abcdef",就是⼀个 字符串。
字符串的打印格式可以使⽤ %s 来指定,也可以直接打印如下:
int main()
{
printf("%s\n", "hello C");
printf("hello c");
return 0;
}
C语⾔字符串中⼀个特殊的知识,就是在字符串的末尾隐藏放着⼀个 \0 字符,这个 \0 字符是字符串的结束标志。
对于字符串"abcdef",我们实际上看到了6个字符:a,b,c,d,e,f,但是实际上在末尾还隐藏⼀个 \0 的转义字符。
\0 是字符串的结束标志。
所以我们在使⽤库函数 printf() 打印字符串或者strlen() 计算字符串⻓度的时候,遇到 \0 的时候就⾃动停⽌了。
C语⾔中也可以把⼀个字符串放在⼀个字符数组中,我们在这⾥利⽤下⾯的代码验证⼀下 \0 的功能。
int main()
{
char arr1[] = {'a', 'b', 'c'};//arr1数组中存放3个字符
char arr2[] = "abc"; //arr2数组中存放字符串
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
这样的代码,在进行调试的时候,观察⼀下 arr1 和 arr2 的内容
//下面代码,打印结果是什么?为什么?(突出'\0'的重要性)
int main()
{
char arr1[] = {'a','b','c'};//arr1数组中存放3个字符
char arr2[] = "abc";//arr2数组中存放字符串
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
arr1和arr2中的内容对比
运行结果:
我们可以看到, arr1 字符数组在打印的时候,打印了 a 、 b 、 c 后还打印了⼀些随机值,这就是因为 arr1 在末尾的地⽅没有 \0 字符作为结束标志,在打印的时候没有停⽌。
但是 arr2 的打印就是完全正常 的,就是因为 arr2 数组是使⽤字符串常量初始化的,数组中有 \0 作为技术标志,打印可以正常停⽌。
如果我们在arr1数组中单独放⼀个 '\0' 字符会怎么样呢?
看到三次打印的结果是⼀样的了,都是打印到 \0 的时候就停⽌了,那从上述的例⼦我们确实能够观察到 \0 的作⽤和重要性的。
此时再用Strlen来观察:
4.Strlen
int main()
{
char arr[] = {'a', 'b', 'c'};
printf("%d\n", strlen(arr));
return 0;
}
strlen是用来获取字符串的长度的,遇到\0字符串结束标志才会结束,对于arr这个字符数组,由于它没有字符串结束标志,所以strlen会一直往后找直到遇到\0才会结束,所以这里是随机值。要把这里改为char arr[]="abc"才可以。因为字符串自动补\0。
5.转译字符
转义字符顾名思义就是转变意思。 下面看一些转义字符。
\130是八进制,转换成10进制就是88,即ASII码表上的X
\x30 x表示是16进制,转换成10进制就是48,即ASII码表上的0