指針內部的存儲形式

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

}

發佈了30 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章