26 指標的本質分析

2021-08-17 07:06:09 字數 2018 閱讀 2093

程式中的變數是一段儲存空間的別名,本質上是一段儲存空間。

問題:是不是只能通過變數使用儲存空間?

#include

int main()

總結: 可以通過指標來使用儲存空間。

在指標宣告時, * 號表示所宣告的變數為指標;

在指標使用時,* 號表示取指標所指向的記憶體空間中的值。

指標的特殊點:

1. 指標的本質是變數,但變數的值是乙個記憶體位址;

*號在指標中類似一把鑰匙,通過這把鑰匙可以開啟記憶體,讀取記憶體中的值。

小貼士:

輸出結果:

&i = 0xbff7d6c0, pi = 0xbff7d6c0, i = 10

sizeof(int) = 4, sizeof(int*) = 4, &pi = 0xbff7d6c4

sizeof(char) = 4, sizeof(char*) = 4, &pc = 0xbff7d6c8

sizeof(float) = 4, sizeof(float*) = 4, &pf = 0xbff7d6cc

在同一編譯器下,指向不同型別的指標占用記憶體的大小一樣的原因:指標為變數,儲存位址值,對於一台計算機,它的記憶體位址占用的空間跟位址匯流排有關,我們常說的32位系統,64位系統指的是記憶體位址的定址範圍,當使用32位系統的編譯器,它的定址範圍也就是32位,即4個位元組;換句話說所有的32系統上的指標變數都可以用4個位元組儲存任意型別的位址值。

指標是變數,因此可以宣告指標引數

當乙個函式體內部需要改變實參的值,則需要使用指標引數

函式呼叫時實參值將複製到形參指標適用於複雜資料型別作為引數的函式中,如果通過乙個很大的結構體來呼叫乙個函式,往往將這個函式的引數宣告為指標引數。

例子;當乙個函式體內部需要改變實參的值,則需要使用指標引數——兩個值的交換

#include

void exchange1(int* a, int* b)

int main()

輸出結果:

m = 1, n = 2

m = 2, n = 1

總結:通過傳址呼叫來交換兩個值

指標的本質就是變數,而關鍵字const可以修飾乙個變數 ==> 可以用const來修改指標。

const

int* p; // p的值是變數,p指向的內容不可變,即p可以重新賦位址值,但*p不能重新賦值;

intconst* p; //p的值是變數,p指向的內容不可變,即p可以重新賦位址值,但*p不能重新賦值;

int* const p; // p的值不可變,p指向的內容可變,即p不可以重新賦位址值, *p可以重新賦值

const

int* const p; // p和p指向的內容都不可變,即p不可以重新賦位址值, *p不可以重新賦值

口訣: 左數右指

當const出現在* 號左邊時指標指向的資料為常量;

當const出現在* 號右邊時指標本身為常量。

#include

int main()

指標是c語言中一種特別的變數

指標所儲存的值是記憶體的位址

可以通過指標修改記憶體中的任意位址內容

26 指標的本質分析

注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 4.4.5 一 變數回顧 程式中的變數只是一段儲存空間的別名,那麼是不是必須通過這個別名才能使用這段儲存空間?二 思考 下面的程式輸出什麼?為什麼?int i 5 int p i prin...

NO15 指標的本質分析

變數 程式中的變數只是一段儲存空間的別名,那麼是不是必須通過這個別名才能使用這段變數?可以 號的意義 在指標宣告時,號表示所宣告的變數為指標 在使用時,號表示取指標所指向的記憶體空間中的值 指標是變數,因此可以宣告指標引數,當乙個函式體內部需要改變實參的值,則需要使用指標引數,函式呼叫時實參值將賦值...

24 指標的本質

變數代表一段儲存空間的別名,但並不是只能通過變數才能訪問一段記憶體了,指標也可以 1 號的意義 p i p i 為什麼指標的大小占用為4個位元組?因為如果系統是32位,位址定址範圍為4個位元組,所有的32位位址值都可以用4個位元組表示,所以32位系統指標的大小都為4個位元組 2 傳值呼叫與傳址呼叫 ...