1.在程序编译时,会产生一个变量名列表(即变量标识符列表,面向对象程序设计中变量也叫对象包括:我们常说基本类型变量,自定义类类型变量,及它们的常量变量静态变量等,甚至包括字面常量,函数甚至也可以称之为变量(对于定义完的具体函数也会分配到自己的空间,有自己的类型,可以取其地址,所以函数也可以称之为对象,这体现了一切都是对象的思想,但一般我们说变量还是指前几种)。)。这个变量名列表又可称之为变量入口地址列表。每个变量名映射到变量名列表的固定位置。便于以后编译时使用。这些变量又被指定类型,这些类型(如int,string, 类,等存在于程序区,以便定义或初始化变量时使用),变量名列表中值对应的便是变量的地址(变量入口地址)。具体变量的地址中对应的便是变量的值或定义体。同样对于数据类型(数据类型有基本数据类型,自定义数据类型,及对于他们的迭代类型(指针,数组))来说,类型也被存储,对于自定义的类来说,在定义类型名的时候,也会开辟一部分存储空间,存放static变量(函数定义目前不知道是否在这部分空间)等。下面程序可以看出实例一个对象,会占用一部分存储空间,本身类类型也占用一部分存储空间:
#include <iostream>
using namespace std;
class A
{
public:
int i;
static int j;
static int k;
static void func1() {}
void func() {}
};
int A::j = 0;
int A::k = 0;
typedef void (*FUNC)();
int main()
{
A a;
cout << sizeof(a) << endl;
cout << sizeof(A) << endl;
cout << &a << endl;
cout << &a.i << endl;
cout << &A::func << endl;
cout << &A::i << endl;
cout << &A::j << endl;
cout << &A::k << endl;
cout << &A::func1 << endl;
return 0;
}
2.所以当我们对一个定义的变量使用取地址操作符的时候(&),程序查询变量名列表,将其对应的值(即地址)取出。注:当我们对一个名称只声明,而没有定义时,无法对其取地址。如:
#include<iostream>
using namespace std;
void func();
int main()
{
cout << &func << endl; //error
cout << func << endl; //error
}
#include<iostream>
using namespace std;
void func() { };
int main()
{
cout << &func << endl; //ok
}