我们提到过变量名本身代表了变量的类型和变量的首地址,但这些只有编译器自己才知道。如果我们想在程序中知道每个变量名的类型,变量类型所占内存空间的大小和内存空间的首地址,我们可以通过sizeof表达式,typeid表达式和地址操作符来完成。
sizeof表达式和typeid表达式我们之前讲过,语法是sizeof(类型)和typeof(类型)。但sizeof和typeof除了后面跟数据类型的名字之外,也可以跟变量名,表示变量名所代表的变量的大小以及类型。例如,
unsigned long ul_var = 0;
float f_var = 0.0F;
std::cout << typeid(ul_var).name() << " " << sizeof ul_var << std::endl;
std::cout << typeid(f_var).name() << " " << sizeof(f_var) << std::endl;
要注意的是,sizeof跟变量名的时候可以有括号,也可以没有括号(但sizeof跟类型的时候必须有括号)。而typeid无论跟类型和变量名都必须有括号。
小知识:typeid表达式的返回结果是会忽略掉const的。虽然const int和int是不同的类型,但是typeid(const int)和typeof(int)的结果一样。有兴趣的读者可自己验证。在C++中,const类型和非const类型是不同的数据类型,但也有很多时候const会被忽略掉,typeid只是其中的一种情况,我会在以后的章节归纳总结这些情况。
要知道变量名所代表的变量的内存首地址,就要用到地址操作符,语法为"&变量名"。
unsigned long ul_var = 0;
std::cout << std::hex << &ul_var << std::endl;
&ul_var就表示编译器为ul_var自动预留的内存的首地址。
小知识:对于sizeof和typeof表达式来说,变量只需要被声明了就可以了(并不需要变量的定义),但是地址操作符因为需要内存的首地址,需要变量被定义。当我们需要读写一个变量的时候,也需要变量被定义。