計算機程序在存儲數據時必須跟蹤以下3個屬性
信息存儲在何處存儲的值為多少存儲的信息是什么類型 之前我們使用過另一種策略來達到上述目的:定義一個簡單變量,聲明語句指出了值的類型和符號名,還讓程序為值分配內存,并在內部跟蹤該內存單元 下面來看另一種策略,它在開發C++類時非常重要。這種策略以指針為基礎,指針是一個變量,其存儲的是值的地址,而不是值本身。在討論指針之前,我們先看一看如何找到常規變量的地址。只需要對變量應用地址運算符&
, 就可以獲得它的位置 #include <iostream> int main() { using namespace std; int a = 6; double b = 4.5; cout << "a value = " << a; cout << " and a address is " << &a << endl; cout << "b value = " << b; cout << " and b address is " << &b << endl; return 0; }輸出如下,顯示地址時,該實現的cout使用十六進制法,因為這時常用于描述內存的表示法。
a value = 6 and a address is 0x7ffedf68996cb value = 4.5 and b address is 0x7ffedf689970面向對象(OOP)與傳統過程性編程的區別在于,OOP強調的是在運行階段決策,這樣更靈活。如在C++中聲明數組,必須指定數組長度,這就是編譯階段決策。而下文就就會提到,C++通過OOP使用關鍵字new請求正確數量正確的內存以及使用指針表來跟蹤新分配的內存的位置。
#include <iostream> int main() { using namespace std; int updates = 6; // declare a variable int * p_updates; // declare pointer to an int p_updates = &updates; // assign address of int to pointer //exPRess values two ways cout << "Values: updates = " << updates; cout << ", *p_updates = " << *p_updates << endl; //express values two ways cout << "Addresses: &upadates = " << &updates; cout << ", p_updates = " << updates << endl; //use pointer to change value *p_updates = *p_updates + 1; cout << "Now updates = " << updates << endl; return 0; }輸出如下,從中可以知道int變量updates和指針變量p_updates
只不過是同一枚硬幣的兩面。變量updates表示值,并使用&
運算符來獲得地址: 而變量p_updates表示地址,并使用*
運算符來獲得值。由于p_updates指向updates,因此*updates 和updates完全等價(譯者注: 如果覺得這里有點繞,先把指針當作語法糖,后面的文章會詳細介紹)。
計算機需要跟蹤指針指向的值的類型,因此在指針聲明時必須指定指針指向的數據的類型,例如
int *p_updates需要注意的是,對每個指針變量名,都需要使用一個*
int *p1, p2;如果這樣聲明,就創建一個指針p1和一個int變量p2。(譯者注:p1前面的int,不代表p1是一個int。指針和數組一樣,都是基于其他類型的) 可以在聲明語句中初始化指針
#include <iostream> int main() { using namespace std; int a = 5; int *pointer = &a; cout << a <<"; address = "<< &a << endl; cout << *pointer <<"; value of pointer = "<< pointer << endl; return 0; }輸出如下
5; address = 0x7ffccfb23a2c 5; value of pointer = 0x7ffccfb23a2c可以看出,程序將pointer
初始化為變量a的地址。注意: 在不同的系統上,顯示的地址可能不同,顯示格式也可能不同,這里僅供參考。
在C++中創建指針時,計算即將分配用來存儲地址的內存,但不會分配用來儲存指針所指向的數據的內存。
long * fellow; // create a pointer to long *fellow = 233333;fellow確實是一個指針,但上述代碼沒有將地址賦值給fellow,那么233333將被放在哪里呢?我們不知道,由于fellow沒有被初始化,它可能有任何值。不管值是什么,程序都將它解釋為存儲233333的地址,如果fellow的值碰巧為1200,計算機將把數據放在地址1200上,即使這恰巧是程序代碼的地址。這種錯誤可能導致一些最隱匿的錯誤
新聞熱點
疑難解答
圖片精選