我的 C 學習歷程 之五 指標與引用

2021-05-22 22:38:55 字數 2031 閱讀 9132

所謂指標就是在記憶體中的位址,它可能是變數的位址,也可能是函式的入口位址.如果指標變數儲存的位址是變數的位址,我們稱該指標為變數的指標(或變數指標);如果指標變數儲存的位址是函式的入口位址,我們稱該指標為函式的指標(或函式指標).

注意:指標變數與變數指標的含義不同:指標變數也簡稱為指標,是指它是乙個變數,且該變數是指標型別的;而變數指標是指它是乙個變數,該變數是指標型別的,且它存放另乙個變數的位址.

區域性變數等的記憶體空間是編譯器在棧中自動分配的,它的作用域和生存期侷限於所定義的程式塊中.我們也可以在堆中用new運算子自己申請記憶體,該記憶體的生存期由程式設計師自己控制.指標的乙個重要用途就是:可以匿名訪問通過new運算子在堆中分配的記憶體.

一般說來,變數有兩種方法訪問:直接通過變數名訪問或通過指標間接訪問.以前我們介紹的程式中,對變數的訪問大多是通過變數名訪問的,變數也可以通過指標間接訪問,即通過變數的指標而找到變數的值,這是我們下面要學習的內容.此外,我們還要學習函式的指標.

引用為變數提供了乙個別名,變數通過引用訪問與通過變數名訪問是完全等價的.引用提供了與指標相同的能力,但比指標更為直觀,更易於理解.

1.1 指標變數的定義

我們已經知道,指標型別的變數是用來存放記憶體位址的.定義了指標型別的變數,就可以在該變數中存放其它變數的位址.如果我們將變數v的位址存放在指標變數p中,就可以通過p訪問到v,我們也說,指標p指向變數v.指標的定義方法是在它所指的變數的型別後面加乙個"*".下面是指標變數定義的例子:

int *ptr1;

char *ptr2;

這個定義說明:ptr1和ptr2均儲存變數的位址,且ptr1指向整型變數,ptr2指向字元變數.定義指標變數時應該注意:

int *ptr1;

int* ptr1;

是等價的.嚴格地說,*是屬於變數名的.例如:

int* pa, pb;

pa和pb分別是屬於什麼型別?pa是乙個指向整型變數的指標,而pb是乙個整型變數.也就是說:*應該是屬於變數名的.根據這個定義,我們可以寫出下面的語句:

pa = & pb;

這個語句是給指標變數賦值.&稱為位址運算子,它是單目運算子,有乙個變數作為它的右運算元,其功能是獲取變數的位址.該語句執行後,pb的位址就被賦給了pa,即pa指向pb

1.2 指標變數的使用

假定pa指向pb,下面的表示式:

*pa是獲取pa指向的變數,即為pb.*稱為間接運算子.它是單目運算子,有乙個變數作為它的右運算元,其功能是獲取指向變數的值.

*pa也能作為左值,即給pa指向的內容賦值.例如:

*pa=10;

在本例中,它與:

pb=10;

的效果是一樣的.

c++編譯器能夠檢查資料型別,如果把乙個變數賦給乙個型別不匹配的資料,可能會出現錯誤,指標也不例外.例如,如果ptr1和ptr2的定義如前,下面的語句就會出現編譯錯誤:

ptr2=ptr1;

如果我們把ptr1強制轉換成char*型別,再賦給ptr2,就可以了:

ptr2 = (char*) ptr1;

如果指標型別是void*型別,則可以與任意資料型別的匹配.例如7-1:

void指標在被使用之前,必須轉換為正確的型別.例如:

int i = 99;

void *vp = &i;

而下面的語句會產生乙個編譯錯誤:

*vp = 3;

如果我們沒有讓指標變數賦值,指標指向的內容並沒有意義.在c++中,有幾個標頭檔案定義了乙個常量null(它的值為0),表示指標不指向任何記憶體單元.我們可以把null常量賦給任意型別的指標變數,初始化指標變數.例如:

int *ptr1=null;

char *ptr2=null;

null常用於基於指標的資料結構(例如鍊錶)的末尾(參見第八章),處理這樣的資料結構通常是用迴圈語句.遇到null指標時,迴圈停止.

注意:全域性指標變數被自動初始化為null,區域性指標變數的初值是隨機的.我們程式設計錯誤常常出現在沒有給指標賦初值.未初始化的指標可能是乙個非法的位址,導致程式執行時出現"segmentation fault", "bus error", "system error 2" 等錯誤,而使程式執行終止.

c 指標(五) 指標的指標

int p 這定義了乙個什麼指標呢?不急不急,慢慢來分析 int a 上條語句我們定義了乙個整型變數 a 首先,我們不妨把 p 和 a 模擬一下,那麼 p 就是乙個整型變數,我們不妨叫這個整型變數 target 按照位址找下去,最終找到的實實在在的int型變數 由於 p target,同時 p p,...

C基礎(五)指標

書目 c程式設計 第三版 表示形式含義a 二維陣列名,指向一維陣列a 0 即0行首位址 a 0 a 0 a 0行0列元素位址 a 1,a 1 1行首位址 a 1 a 1 1行0列元素a 1 0 的位址 a 1 2,a 1 2,a 1 2 1行2列元素a 1 2 的位址 a 1 2 a 1 2 a 1...

C語言學習(五)指標

int main int i 定義整型變數 int 為指向整型資料的指標變數 inta n 定義整型陣列 它有 個元素 int 定義指標陣列 它由 個指向整型資料的指標元素組成 int p為指向含n個元素的一維陣列的指標變數 int f 為帶回整型函式值的函式 int 為帶回乙個指標的函式,該指標指...