变量定义:一个数据类型+一组声明符(类型修饰符 为声明符一部分)
1.数据类型:
- 基本的数据类型有:整形、实型、字符型、指针型等
- 扩展的数据类型有:数组,结构体,联合、共用体等
- 自定义的类型
- 类型指示符 decltype
- 类型说明符 auto
auto i = 0, *p = &i; //通过初始值来推算类型,只会对第一个初值进行推测
2.可修饰数据类型的修饰符:
数据类型的修饰符修饰的是一组声明符所代表的变量
如 const char i='a, j= 'a'; //i, j都是const char 型
-
1.数据类型说明符:signed, unsigned, short, long
他们也可以代表简化的写法来定义变量
类型所占字节:C++标准规定,int占一个机器字长。在32位系统中int占32位,也就是4个字节,而在老式的16位系统中,int占16位,即2个字节。而C++标准中只限制规定short int不能超过int的长度,具体长度的可以由C++编译器的实现厂商自行决定。目前流行的32位C++编译器中,通常int占4字节,short int占2字节。其中short int可以简写为short。类似地,C++标准只限制了long int不得小于int的长度,具体也没有作出限制
-
2.存取限定符:const, volatile
-
3.存储分类说明符:extern, static, register, auto
默认情况下,char a ;实际就是auto char a;只是将auto省略了。auto是一个可读可写的内存空间--栈空间
register :1,限制变量定义在寄存器上的修饰符,cpu上的寄存器(cpu内部内存),可以使变量不用指向内存,直接指向cpu的寄存器 2,定义一些快速访问的变量,编译器会尽量安排CPU的寄存器去存放这个这个A,如果寄存器不足,A还是会放在存储器中 3,无法访问变量的地址(如果访问则register失去作用)
- 4.其他:constexpr
有编译器来验证变量的值是否为常量表达式,是静态常量数据,新标准前用static const定义,只有文件作用域。
3.可修饰声明符的修饰符:
声明修饰符修饰的只是单个标识符表示的变量,即只表示一个变量
例子:
char *const ci = &i, cj; //cj为char
char const *ci=&i, cj ; //cj为const char
这里在存取限定符如果在 *和表示符之间定义,则修饰单个变量,如果在*和表示符前定义,则修饰所有的一组变量。
-
1.类型修饰符 *, &, [], ()
这些修饰符混合时,从变量名称开始往右读,读到尽头或闭括号之后再从变量名称开始往左读。
int *p; int *&r =p; //对指针p的引用
int *a[];//先往右读,[]是有一个数组,再往左读int *是指向int的指针。所以int *a[]就是由指向int的指针组成的数组,等价于int *(a[])。
int (*a)[]//先由a往右读,碰到),因此再往左读,读到*,因此是一个指针。然后再往右读[],再往左读int。所以最后int (*a)[]是指向由 //int组成的数组的指针。
同理,int *f(),是一个函数,返回一个指向int的指针。而int (*f)()则是一个指针,指向一个返回int的函数。
-
2.存取限定符:const, volatile