指標本身已經是非常底層的東西了,什麼是底層?一般說的底層就是和硬體比較接近的地方。
另外強調一點:計算機最重要的就是對資料的處理,所以資料的存放你是一定要知道的——資料存放在記憶體中!底層的資料就是二進位制數,這你可以暫時不用管。
所以程式設計的本質,就是改變資料的流向。比如和人家qq聊天,就是將資料從頭腦到手到鍵盤到記憶體到檔案或顯示器的過程。其中,記憶體就相當於乙個資料中轉站,所以本次我們講指標,也是圍繞這個中轉站開始講的。
所謂指標,就是指向記憶體的乙個標記,所以指標就經常形象化就是記憶體中的位址。所以,你完全可以把位址當作指標。
問題1:記憶體為什麼需要位址?這個問題就相當於你問我這個世界上為什麼會有這麼多地名?地名就是標記,目的是為了【找到回家的路】,也就是找到家,對吧。所以位址就是為了找到記憶體,從而找到記憶體中的資料。因為前面我們說過,程式設計的本質就是改變資料的流向,而記憶體就是資料的中轉站,所以我們必須給這個中轉站一定的位址編號,方便我們控制資料的流向。
所以說位址最終還是為資料而服務的。因為我們要的不是位址,而是位址裡面的寶藏和東西對吧,這些寶藏就是資料。
問題2:位址是資料嗎?接觸比較廣的同學,一般都會知道c語言中的變數可以分為這兩種。對的,位址也是資料,但是計算機能單獨識別和區分位址這種特殊的資料,而且,位址一般都比普遍的資料更短,對吧!
1、區別:
普通變數可以直接往裡面存資料:
int a=
12345
;//a是普通變數
int a=
12345
;//a是普通變數
//宣告:*號代表這是乙個指標變數,p是它的名字
int*p;
//使用:僅僅使用它的名字!
p=&a;
這樣下來,指標p就攜帶了變數a在記憶體中對應的位址。
注:有些初學者就經常寫成:*p=
&a這就沒有正確區分宣告和使用兩個概念:
1.宣告:宣告有這個東西(名字),這個東西是什麼型別的。
2.使用:使用名字
2、轉換:為了能夠使用資料,一般需要轉化為普通變數才能實現。
這時候你可能就會發問了:不是說scanf函式需要的是位址嗎,還需要什麼轉換?1.普通變數公升級為指標變數:定址符&其實,scanf函式也是由**寫成的,然後放進標頭檔案,所以說,只是你看不見scanf的那個大括號裡面的內容而已,或許裡面使用了轉化呢!因為我們一直都是在使用名字——變數名,函式名,所以總會給我們一些錯覺。
2.指標變數降級為普通變數 :指向符*
例子:
int a;
//a是普通變數
scanf
("%d"
,&a)
;//&a是位址,指標
printf
("%d"
,a);
//a是普通變數
char c;
scanf
("%c"
,&c)
;//&c是位址,指標
printf
("%c"
,c);
//c是普通變數
char d[10]
;scanf
("%s"
,d);
//d是位址,指標
printf
("%s"
,d);
//d是位址,指標
注意:只有基本資料型別的變數的printf才需要普通變數,
而陣列是構造的資料型別,因此需要的仍然是指標。
這裡用的是陣列的首位址。
最後的宣告:學習和使用指標需要掌握的三個方面:
①指標資料和普通資料本質是沒有區別的,但是因為計算機能識別區分他們,
所以你必須把它倆當成兩種不同的資料型別,以免混用。
比如:
②指標變數與普通變數之間的轉換:指標有多重指標,但普通變數只有一級。普通變數是我們在程式設計中使用資料的視窗,指標與他們都存在對應關係。所以一定要學會判斷指標的級別和哪個是普通變數,哪個是指標變數。因為指標變數一般是不可以直接用於提取記憶體中的資料的。
比如:
③構造資料型別定義的普通變數名本質是乙個指標變數。注意區分宣告定義格式和使用格式,宣告定義一般包含兩部分:資料型別,變數名。但是使用格式,是使用它的變數名。
比如陣列名,指標變數名,結構體聯合體定義的變數名,這些都是指標,包括函式名。
比如:
C語言 陣列指標詳解,區別於指標陣列。
題意 使用指標 p 和prt 表示a 1 2 include include include include using namespace std int main int prt 3 a 不等於 prt 4 意義不同,用法相同 int t 4 指標陣列,即宣告了4個指標,要for迴圈初始化分別指...
詳解C語言中的陣列指標與指標陣列
詳解陣列指標與指標陣列 陣列指標 一 區分 首先我們需要了解什麼是陣列指標以及什麼是指標陣列,如下圖 int p 5 int p 5 陣列指標的意思即為通過指標引用陣列,p先和 結合,說明了p是乙個指標變數,指向乙個大小為5的陣列。所以,int p 5 即為乙個陣列指標。int p 5 則是乙個大小...
C語言指標詳解 陣列與指標
我們可以在函式實參中直接使用陣列名來使用陣列,陣列元素的指標就是陣列元素的位址。我們又知道陣列名代表陣列首元素的位址。因此 p a 0 p a 這兩條語句是等價的。我們再看一下它的初始化語句 int p a 0 或寫成 int p a 下面介紹下陣列指標的運算 當指標已經指向乙個陣列元素時可以進行 ...