数据类型最大的作用是帮我们规定好数据的大小,而不是里面所存放的内容。各个数据类型所规定出的大小可以用操作符sizeof求出。
数据类型后的变量名的本质是它内存地址的别名。
数据类型的表示方式有两种。一种是我们常用的基础数据类型。如int,char等等。还有一种是我们自定义的数据类型,typedef和struct。关于typedef,它是来给我们的数据类型绑定一个别称,如
typedef unsigned long size_t; 即可以用size_t来取代unsigned long这样可以是我们写出来的代码可读性更强。更加容易让我们理解程序的语义
与define在语法上面的不同:typedef应该将我们使用的别名放在基础类型的后面。
与define在使用上面的不同:
`#define PDINT int*
typedef int* PTINT;
int main()
{
PDINT p1, p2;
PTINT p3, p4;
return 0;
}`
此段代码分别用define和typedef定义的一个int*的指针别名。由于define只是简单的替换。所以可以将PDINT换为int* 这样main函数中的第一句就是
int* p1,p2;
可以看出p1为一个int型的指针变量,而p2只是一个int型的变量。
而typedef则不同,p3,p4均为指针变量。
关于struct的使用,请参考struct与union
数据类型的使用方式:类型名+变量名。此时编译器就会取下一块指定大小的内存空间来存放里面的数据
在我们使用的数据类型里面都会有各自的属性。编译器默认的局部变量分配的方式为auto。它在栈区分配空间,全局变量无法使用。所以说我们平时定义的局部变量前面默认是加上auto的。如auto int index;
static:存储在程序的静态区,它只会被初始化一次。
当它修饰全局变量时,会将作用域限制在当前文件中,外部文件不可访问。
当它修饰局部变量时,它的生命周期和全局变量是一样的,但是作用域只在当前的大括弧({})中
register:存储在寄存器中,用它声明的变量必须是单个寄存器所能接受的值,也就是最大位一个int的大小。而且我们无法取到它的地址,因为分配在寄存器中没有地址。使用此关键字仅仅只是发出请求,能不能分配成功由我们的编译器来决定。而且全局变量无法使用。
生命周期与作用域:
生命周期即为此变量内存地址存在的时间,比如存放在栈中的局部变量在这个函数结束时,它的生命周期也就结束了。
作用域简单理解为存在于两个大括弧之间