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
}