基本数据类型可以作为变量与常量使用,顾名思义,变量运行时可以改变其值,常量运行时不会改变其值。
常量分为整型常量、浮点型常量、字符常量、字符串常量和符号常量。
通常用#define来定义一个标识符来表示一个常量
用type name = 常量来定义一个变量, 变量可以理解成一个容器,可以乘装不同的常量,也可以理解成计算机为name这个标识符开辟的一个个以字节为单位的小格子,小格子的数量就是变量类型type所占据的存储空间。每个小格子里的内容依次是当前所装载的常量数据的字节流
如自然数:
#define CONSTANT_MAX_BUF_LEN_DEC 128
int maxBufLenDec = CONSTANT_MAX_BUF_LEN_DEC;
其中,CONSTANT_MAX_BUF_LEN_DEC为整型常量十进制整数128,maxBufLenDec为变量
八进制的数表示为前面带“0”的数。如
#define CONSTANT_MAX_BUF_LEN_OCT O200
int maxBufLenOct = CONSTANT_MAX_BUF_LEN_OCT;
其中,CONSTANT_MAX_BUF_LEN_OCT为整型常量八进制整数O200,maxBufLenOct为变量
与八进制不同,十六进制整数以“0x”开头,如:
#define CONSTANT_MAX_BUF_LEN_HEX 0x80
int maxBufLenHex = CONSTANT_MAX_BUF_LEN_HEX;
其中,CONSTANT_MAX_BUF_LEN_HEX为整型常量十六进制整数0x80,maxBufLenHex为变量
与八进制不同,二进制整数以“0b”开头,如:
#define CONSTANT_MAX_BUF_LEN_BIN 0b10000000
int maxBufLenBin = CONSTANT_MAX_BUF_LEN_BIN;
其中,CONSTANT_MAX_BUF_LEN_BIN为整型常量二进制整数0b10000000,maxBufLenBin为变量
注意:KEIL编译器C99并不支持二进制整数的表示与输出,使用以上代码编译时会报错:expected a “;”
所以,一般我们并不直接使用二进制数作为常量给变量赋值,而是使用十六进制,如果非要考虑使用二进制位来表示数据,可以考虑使用位域,后期会专门讲解,此处不做展开。
浮点型常量以“f”结尾
#define CONSTANT_PI 3.141592f
float pi = CONSTANT_PI;
其中,CONSTANT_PI为浮点型常量3.141592f,pi为变量
用单引号界定起来的一个普通字符或转义字符,如: ‘a’、‘A’、‘\n‘、'\t’等。
普通字符可以是字符集中任意一个字符。普通字符常量的值就是该字符的ASCII值。
转义字符是一种特殊的字符常量,以反斜线“\”开头,后跟一个或几个字符,主要用来表示那些无法输出的控制字符或者特殊字符。
转义字符对照表
转义字符 | 意义 | ASCLL码值(十进制) |
---|---|---|
\a | 响铃(BEL) | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\’ | 代表一个单引号’ | 039 |
\" | 代表一个双引号字符" | 034 |
\\ | 代表一个反斜线字符’\’ | 092 |
? | 代表一个问号? | 063 |
\0 | 空字符(NUL) | 000 |
\ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 |
\xhh | 十六进制所代表的任意字符 | 十六进制 |
#define CONSTANT_ENTER '\n'
char word = CONSTANT_ENTER;
其中,CONSTANT_ENTER为字符常量’\n’,word为字符变量。
用一对双引号括起来的一个字符序列,如:“Hello World”、“Master"、“n”、"$1000”等。
存储:系统自动在字符串常量后面加上“\0”作为字符串结束标志。
#define CONSTANT_HELLO "Hello World\n"
#define CONSTANT_MASTER "Master"
char* words = CONSTANT_HELLO;
words = CONSTANT_MASTER;
其中,CONSTANT_HELLO为字符串常量"Hello World\n",CONSTANT_MASTER为字符串常量"Master"。
使用了char* words定义了字符串变量,其本质是一个字符指针。这里相当与将CONSTANT_HELLO及CONSTANT_MASTER的首地址赋值给字符指针words。
使用**#define宏定义**,前面所述的用标识符替换各常量的表示就是符号常量。
通常将符号常量放在头文件中,然后在源文件函数中调用。
变量的定义:变量必须经过定义才能使用,变量的定义即为变量开辟内存空间,开辟空间的大小即为变量类型所占的大小。变量的值的范围以变量类型的空间大小和及符号位所决定。同一作用域变量只能定义一次。变量在源文件中定义,永远不要在头文件中定义变量。
int a; //定义一个整型变量a
float b; //定义一个浮点型变量b
double c; //定义一个双精度型变量c
char d; //定义一个字符变量d
char* p; //定义一个字符指针变量p
void test(void)
{
int sizeOfA = sizeof(a);
int sizeOfB = sizeof(b);
int sizeOfC = sizeof(c);
int sizeOfD = sizeof(d);
int sizeOfP = sizeof(p);
printf("size of a = %d",sizeOfA); //size of a = 4
printf("size of b = %d",sizeOfB); //size of b = 4
printf("size of c = %d",sizeOfC); //size of c = 8
printf("size of d = %d",sizeOfD); //size of a = 1
printf("size of p = %d",sizeOfP); //size of p = 4
}
变量的申明:加上extern关键字的变量即为变量声明,同一作用域变量可声明多次。变量可在源文件中声明,也可在头文件中声明(用作外部变量)
extern int a; //申明一个整型变量a
extern float b; //申明一个浮点型变量b
extern double c; //申明一个双精度型变量c
extern char d; //申明一个字符变量d
extern char* p; //申明一个字符指针变量p
变量定义后,还需要初始化,否则其值会得到预期外的结果。
a = 1024;
b = 0.001024;
c = 0.0000001024;
d = '\n';
p = "Hello World";
变量初始化后,通过直接调用变量可得到变量的值。
printf("a = %d",a);
printf("b = %f",b);
printf("c = %lf",c);
printf("d = %c",d);
printf("p = %s",p);
变量在哪里定义的,其作用范围就在哪里,如果超出这个作用范围,就会得到变量未定义的错误。作用范围就是{}内部代码块的范围
如
{
int i = 0;
}
i += 1;// identifier "i" is undefined
在源文件中函数外定义的变量就是全局变量
在函数中定义的变量就是局部变量。
通过static修饰的变量就是静态变量
静态变量用作全局变量时,它在整个当前源文件都是可见的,而在文件之外是不可见的,在头文件中使用extern声明会得到变量未定义的错误。去掉static修饰,变量用extern就可以访问了。
静态变量用作局部变量时,在程序执行到该变量的定义处时被首次初始化,以后的函数调用不再进行初始化;
动态变量在函数中,每次调用函数都会从初始值开始赋值。
int addTest(int i)
{
static int sum = 0;
sum += i;
return sum;
}
int add(int i)
{
int sum = addTest(i);
return sum;
}
void testAdd()
{
int sum = 0;
for (int i = 0 ; i < 100 ; i++)
{
sum = add(i + 1);
}
printf("sum = %d",sum); //sum = 5050
}
变量用const修饰时,就是常变量
常变量指定义时必须显示初始化且值不可修改的变量。与其他变量一样被分配空间,是可以寻址的。注意,字符串常量是常变量的一种,名称为其本身,因为其存储在静态存储区的常量区,可寻址,不可修改。
常变量和常量的区别是:
常量不开辟内存空间。在预编译时就全部由符号常量的值替换了,⽽常变量占⽤内存空间,只是此变量在存在期间不能重新赋值。
常量在计算机运行时,不会被程序修改的量,常变量是在运行时被计算机赋予的值,其值不是唯一的。