指標部分釋疑之一 指標的實質

2021-08-24 20:01:24 字數 2564 閱讀 2011

指標部分釋疑

在學習c/c++

過程中,可能大多數學習者對指標都會產生厭煩乃至牴觸情緒。的確,對於初學者來講,指標是不好理解,也不好用,好多學習者喜歡採用不用指標的方式來解決問題,即「能不用指標就不用指標」,甚至把指標當成了人人喊打的「goto

」來看待……

而其實,指標也是冤枉的,大家看到的都是指標的缺點,卻沒有人意識到指標的好處。那麼,指標到底是什麼,怎麼用,怎麼樣才能用好?

從概念上來講,指標其實是一種資料型別,沒錯,就是一種資料型別而已,我們看看c

中的資料型別的概念——data type

,呵呵,這麼簡單?對,就這麼簡單,翻譯過來不就是「資料的型別」嗎!接上文,指標也是一種資料型別,那麼這個故事告訴我們指標真的很簡單!

讓我們就從資料型別講起,就說大家都熟悉的整型:

int a = 5;

上面這句很簡單,大家都知道,定義了乙個整型變數a

,並初始化其值為5

。究其根本,我們看看系統做了什麼——編譯的時候系統向記憶體申請了2個位元組(c的**,c++是4

個位元組)的空間,即16

位,這兩個位元組是緊鄰的,這只是第一步;第二步是在程式執行的時候,系統將整數常量5

賦值給變數a

,即將0000000000000101

(二進位制補碼)賦值到剛才提及的兩個位元組中,那麼系統是怎麼通過a

找到的這兩個位元組空間呢?很簡單,系統是通過a

(變數名稱)找到了a

所對應的空間,怎麼找的呢?這就要提到乙個運算子「&

」,在c

中叫做位址運算子,是乙個單目運算子,將其加在變數之前,即「&a

」,就是a

所對應的兩個位元組的空間編號,叫做什麼呢?——「位址」(address

),對,很形象!!!但位址又是什麼?想想我們寫信的時候在信封上寫的東東,就很簡單了不是嗎!

這裡有必要提一句,位址在系統中是採用十六進製制數表示的,在c

中可以寫成例如0x54fe7ab5

,但c又很小氣的規定程式設計人員不能直接對位址進行操作(為什麼就不再贅述了),那怎麼辦?就出來乙個運算子「&

」。所以,&a

就是變數a

cout<

執行後系統就會輸出a

的值5和a

的位址0x********

(*是十六進製制數,自己寫個程式試下)。

好,回來接著上面的話題,說指標——指標是什麼?答:指標就是位址!!!

有點暈,剛剛才說過指標是一種資料型別,這麼一會兒就又說指標是位址,什麼意思啊……

重新來過:

int a = 5;

我們說我們定義了乙個整型變數a

,裡面存放的資料必須是整型資料,ok?

int *p = &a;

是說我們定義了乙個指標變數p

,裡面存放的是變數a

的位址,這個還有問題嗎?還有?哦,忘了說了,定義裡面的「*

」是幹嘛的?定義變數的時候在識別符號前面加上乙個「*

」就是說明定義的是乙個指標變數!還有?「int

」是幹什麼的?哦…

還是說說「*

」吧—— 「*

」在c中也是乙個運算子,叫做「指標運算子」,也叫做「間接取值運算子」,前者比較偽善,後者相對實惠,對,就是間接取值的運算子,接下來我們說一下怎麼使用a

和p吧:

若要想訪問a

的話,例如賦值和輸出,直接寫成:

a = 20;

cout<

肯定沒有問題,是吧?那麼p

呢?注意看:

*p = 20;

cout<<*p;

這又是什麼?*p

?解釋如下: *

為間接取值運算子,p

為指標變數,放在一起就是「將p

所指向的空間的內容取出來」,還不明白?再說一次「將p

變數裡面存放的位址拿出來,按照這個位址找到那個對應的空間,然後將空間中的內容取出來」,差不多了吧,但問題是,「那個空間」是多大的?系統怎麼知道?或者說系統取值的時候,是按照字元型取值還是按照整型取值還是按照實型數取值呢?別急,再看p

的定義「int *p = &a;

」,看到沒?在「*

」前面有乙個「int

」,這就是說,我們定義了乙個「指向整型變數的指標變數p

」,如下例:

float a = 20.0;

int *p = &a;

這就不匹配了,可能有人問,系統遇到這種情況會怎麼樣呢?呵呵,我也不知道,開啟你的tc

或vc試一下不就知道了嘛……

總結一下:指標是一種資料型別,其有兩層含義,一是靜態的,即位址的含義,另一是動態的,即指向的含義,使用的時候我們經常用到兩個運算子「*

」和「&

」,明白兩個運算子的含義即可。由此,既然指標是一種資料型別,就可以定義所謂的指標變數,變數的應用大家都不會陌生是吧!(未完待續) ps

:在使用指標變數的時候,一定要注意指標變數的指向問題,如果指標變數沒有指向的話,很重要的原則就是不能使用之,切記!例如:

int *p;

*p = 20; //error

,20賦到**去呢?

cout<<*p; //

這個更離譜,你想輸出什麼?

指標部分釋疑之一 指標的實質 續

指標變數也可以進行算術運算,但只能進行加上或減去乙個整數操作。不過,這種加減運算和我們學習算術運算子的加減操作還是有很大區別的。int a 10 int p a p 上例中,在上例中,指標p 的型別是int 它指向的型別是int 它被初始化為指向整型陣列名a 接下來的第3 句中,指標p 被加了1 編...

C學習筆記之一 指標

指標變數 指標變數也是乙個變數,在指標中存放的內容是一塊記憶體空間的位址。就是說,指標就是 記憶體位址 計算機記憶體的最小單位是byte,每乙個byte都有乙個唯一的編號,這個編號就是記憶體空間的位址,通常叫作記憶體位址。這個編號在32位作業系統下是乙個32位的整數,在64位作業系統下是乙個64位的...

指標(一) 指標運算 指標常量,指標變數

指標運算 參見這裡 include using namespace std 輸出 10 20 30 40 50 0x7e17f0 100x7e17f4 20 0x7e17f4 200x7e17f4 21 0x7e17f4 2130 0x7e17f8 3031 0x7e17f8 31 int main...