变量的作用域1
按作用域划分:变量分局部变量和全局变量
局部变量
处于代码块2中的变量就是局部变量,生命周期伊始于左半括号开始直到右半括号结束变量生命周期结束空间被释放
全局变量生命周期伴随整个程序起始到结束
4种常量
字面常量
const 修饰的常变量
定义举例:
const int var = 998;
被const修饰的变量的值不能赋值改值,但是可以通过指针改变如下:
![](https://img-blog.csdnimg.cn/20201116225547973.png)
#include<stdio.h>
int main() {
const int a = 998;
int* p = &a;
*p = 100;
printf("%d", a);
return 0;
}
扩展:const修饰指针常见的三种情况
-
const位于*前面
const int* ptr;(等价于:int const * ptr;)
ptr指针变量指向的内存空间,其值不能被修改
-
const位于*后面
int* const ptr;
ptr不能重新指向新的变量空间
-
const同时位于*前面和后面
const int* const ptr;
ptr指针变量指向的内存空间,其值不能被修改且ptr不能重新指向新的变量空间
#define 定义的标识符常量
#define关键字是特别实用的一个C语法特征,宏替换以及宏定义类似函数功能
如果一个数字在当前源码中出现次数很多,那么可以用宏定义来表示,以后对代码中大量出现的变量进行修改也有极大的方便
枚举常量
实用enum关键字以及{}进行定义
例子:
enum sex{
male,
falmale,
secret
};
枚举的元素默认都是int类型的,枚举的第一个元素默认从0开始,也可以对单个元素进行赋值进行初始化
总结:只有define的常量和枚举常量可以用于初始化数组元素个数
define的常量初始化数组元素个数
#include <stdio.h>
#define NUM 8
int main() {
int arr[NUM] = {1, 2, 3, 4};
printf("%d\n", *(arr+2));
printf("%d\n", sizeof(arr)/4);
return 0;
}
const修饰的变量严格意义上讲应该叫做常变量,是不能用于声明数组的元素个数
const int num = 10;
int arr[num];
以上代码会报错,原因是:num的值是在运行阶段才有值的,而在编译阶段无法获取值的,因此编译阶段编译器就不知道给数组开辟多大的空间
枚举常量是可以用于数组元素个数的初始化的
#include <stdio.h>
enum {
a = 6,
b
};
int main() {
int arr[a] = { 1, 2, 3, 4 };
printf("%d\n", arr[3]);
return 0;
}
字符数组
两种定义方式
char arr1[]={'a', 'b', 'c'};
char arr2[]="abc";
以上两种初始化是有3点区别:
-
arr2声明的字符数组有四个元素,因为字符串字面常量结尾默认有一个’\0’结束标志符
-
sizeof(arr1)=3,sizeof(arr2)=4
-
strlen(arr1)的结果是随机值,strlen(arr2)=3 7
数组部分初始化:
char arrChar[6] = {'1', '2', '3'};
部分初始化的数组,未给初始值的元素默认是0
数组如果初始化,可以不指定数组的大小
int arrInt[] = {'1', '2', '3'};
总结:C语言中并没有字符串这种变量类型,我们平时使用的实际是字符数组,由于是第二种初始化方式因此结尾都会有结束标志’\0’,使用字符数组的名字去打印字符串也是打印到结束标志’\0’为止,给人一种本身就是字符串的错觉,其实质上是数组
转义字符
反斜杠\用于与普通字符组合表示特殊字符
注意以下组合字符都表示一个字符,注意表示一个反斜杠\要使用’\’
特殊字符 | 释义 |
---|---|
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\’ | 用于表示字符常量’ |
\" | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符。 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\dd | d ddd表示1~3个八进制的数字 8。 如: \130 |
\xd | d dd表示1~2个十六进制数字 9。 如: \x30 (大写X代表16进制的字母大写) |
示例:
strlen("\618") -->结果是2
’\61’是一个字符
strlen("\6131") -->结果是2
’\613’是一个字符
strlen("\x61") -->结果是1
strlen("\xff") -->结果是1
strlen("\xf") -->结果是1
strlen("\xfg") -->结果是2
’\xf’是一个字符
C语言两种注释风格:
单行注释(C++):
//xxxxxxxx内容
多行注释(不支持嵌套,前半注释符只与后文第一个后半注释符闭合):
/* xxxxxxxx内容 */