基本数据类型分析
auto、register、static
if、switch、do、while、for
goto、void、extern、sizeof
const、volatile
struct、union
enum
typedef
基本数据类型
什么是数据类型?数据类型是创建变量的模具
数据类型是创建变量的模具
类型的本质:数据类型可理解为固定内存大小的别名
数据类型的本质是固定内存大小的别名
变量本质
变量是一段实际连续存储空间的别名
程序中通过变量来申请并命名存储空间
通过变量的名字可以使用存储空间
变量是一段实际连续存储空间的别名
类型和变量的关系
$ vim program.c
#include
int main()
{
char c = 0;
short s = 0;
int i = 0;
printf("\n%d, %d", sizeof(char), sizeof(c));
printf("\n%d, %d", sizeof(short), sizeof(s));
printf("\n%d, %d", sizeof(int), sizeof(i));
return 0;
}
$ gcc program.c -o program
$ program.exe
1, 1
2, 2
4, 4
$ vim program.c
#include
//自定义类型(别名)
typedef int INT32;
typedef unsigned char BYTE;
typedef struct _demo
{
short s;
BYTE b;
INT32 i;
} DEMO;
int main()
{
//创建变量
INT32 i32;
BYTE b;
DEMO d;
//数据类型是变量的模子
printf("%d, %d\n", sizeof(INT32), sizeof(i32));
printf("%d, %d\n", sizeof(BYTE), sizeof(b));
printf("%d, %d\n", sizeof(DEMO), sizeof(d));
return 0;
}
$ gcc program.c -o program
$ program.exe
4, 4
1, 1
8, 8
属性关键字
C语言中的变量可以有自己的属性
在定义变量的时候可以附加“属性”关键字
“属性”关键字指明变量的特有意义
auto、static、register
内存分配类型
auto
auto指明变量是在内存的栈上分配空间的
auto是C语言中局部变量的默认属性
编译器默认所有的局部变量都是auto
#include
int g = 0;
int main()
{
auto int i = 0;
static int j = 0;
register int k = 0;
return 0;
}
static
static 关键字指明变量的“静态”属性
static 关键字同时具有“作用域限定符”的意义
static修改的局部变量存储在程序静态区
static是文件作用域标识符
static修改的全局变量作用域只在声明的文件
static修改的函数作用域只在声明的文件中
register
register关键字指明将变量存储于寄存器中
register只是请求寄存器变量但不一定成功
register变量必须是CPU寄存器可以接受的值
不能使用&取地址运算符获取register变量的地址
#include
register int m = 0;
int main()
{
auto int i = 0;
static int j = 0;
register int k = 0;
return 0;
}
$ gcc program.c -o program
λ gcc program.c -o program
program.c:3:14: error: register name not specified for 'm'
register int m = 0;
小结
auto变量存储在程序的栈中,默认属性。
static变量存储在程序静态区中
register变量请求存储于CPU寄存器中
#include
int main()
{
auto int i = 0;
static int j = 0;
register int k = 0;
return 0;
}
#include
int main()
{
auto int i = 0;
static int j = 0;
register int k = 0;
printf("%0X\n", &i);
printf("%0X\n", &j);
return 0;
}
$ gcc program.c -o program
$ program.exe
61FF2C
407020