指標的概念
計算機中所有的資料都必須放在記憶體中,不同型別的資料占用的位元組數不一樣,例如
int 占用4
個位元組,
char 占用1
個位元組。為了正確地訪問這些資料,必須為每個位元組都編上號碼,就像門牌號、身份證號一樣,每個位元組的編號是唯一的,根據編號可以準確地找到某個位元組。
我們將記憶體中位元組的編號稱為位址(address)或指標(pointer)(即位址就是指標)。位址從
0 開始依次增加,對於
32 位環境,程式能夠使用的記憶體為
4gb,最小的位址為
0,最大的位址為
0xffffffff。
一切都是位址
c語言用變數來儲存資料,用函式來定義一段可以重複使用的**,它們最終都要放到記憶體中才能供
cpu
使用。資料和**都以二進位制的形式儲存在記憶體中,計算機無法從格式上區分某塊記憶體到底儲存的是資料還是**。當程式被載入到記憶體後,作業系統會給不同的記憶體塊指定不同的許可權,擁有讀取和執行許可權的記憶體塊就是**,而擁有讀取和寫入許可權(也可能只有讀取許可權)的記憶體塊就是資料。
cpu只能通過位址來取得記憶體中的**和資料
,程式在執行過程中會告知
cpu
要執行的**以及要讀寫的資料的位址。cpu訪問記憶體時需要的是位址,而不是變數名和函式名!變數名和函式名只是位址的一種助記符,
。編譯和鏈結過程的一項重要任務就是
找到這些名稱所對應的位址。
注意:雖然變數名、函式名、字串名和陣列名在本質上是一樣的,它們都是位址的助記符,但在編寫**的過程中,我們認為(1)變數名表示的是資料本身,而(2)函式名、字串名和陣列名表示的是**塊或資料塊的
首位址。
指標變數的概念
資料在記憶體中的位址也稱為指標,如果乙個變數儲存了乙份資料的指標,我們就稱它為指標變數。
例如:假設有乙個
char
型別的變數
c,它儲存了字元
'k'(
ascii
碼為十進位制數
75),並占用了位址為
0x11a
的記憶體(位址通常用十六進製制表示)。另外有乙個指標變數
p,它的值為
0x11a
,正好等於變數
c 的位址,這種情況我們就稱
p指向了c,或者說
p 是指向變數
c 的指針。
指標變數的定義
定義指標變數與定義普通變數非常類似,不過要在變數名前面加星號
*,格式為:
資料型別*變數名;
資料型別*變數名=值;
*表示這是乙個指標變數,該變數存放的是乙個資料的位址。資料型別表示該指標變數
所指向位址記憶體的資料型別。
和普通變數一樣,指標變數也可以被多次寫入,如: //
定義普通變數
float a = 99.5, b = 10.6;
char c = '@', d = '#'; //
定義指標變數
float *p1 = &a;
char *p2 = &c; //
修改指標變數的值
p1 = &b;
p2 = &d; *
是乙個特殊符號,表明乙個變數是指標變數,定義p1、
p2 時必須帶
*。而給p1、
p2 賦值時,因為已經知道了它是乙個指標變數,就沒必要多此一舉再帶上
*,後邊可以像使用普通變數一樣來使用指標變數。也就是說,定義指標變數時必須帶*,給指標變數賦值時不帶*。
假設變數a、
b、c、
d 的位址分別為
0x1000
、0x1004
、0x2000
、0x2004
,下面的示意圖很好地反映了p1、
p2 指向的變化:
需要強調的是
,p1、p2的型別分別是float*和char*,
而不是float
和char
,它們是完全不同的資料型別,
要引起注意。
*pointer; //這裡的*稱為指標運算子,用來取得某個位址上的資料
如:int x = 10;
int y = 20;
int *px = &x;
int *py = &y;
y = *px + 5; //
表示把x
的內容加
5並賦給y,
*px+5
相當於(*px)+5
y = ++*px; //px
的內容加上
1之後賦給y,
++*px
相當於++(*px)
y = *px++; //
相當於y=*(px++)
py = px; //
把乙個指標的值賦給另乙個指標
手機衛士day11
系統程序顯示和隱藏 建立程序管理設定頁面 processmanagersettingactivity 編寫設定頁面布局檔案 監聽checkbox的勾選事件,更新本地sharepreference 根據本地記錄,更新checkbox狀態 boolean showsystem mprefs.getboo...
實習日記 Day11
滴 今日份心得總結卡 今日最大心得其實應該是,穿一條薄褲子還露腳踝的我怕是失了智,早上腿差點都凍僵了 1.不要從別人身上尋求安心 做好自己,降低對人際關係的預期。果然,邊際遞減效應 應驗了,上週還覺得和諧無比的同事 師徒關係,這週就開始覺察到距離感。我曾以為我的認真工作和順利完成任務能得到上司或者師...
區間合併 day 11
區間合併 問題 給定 n 個區間 li,ri 要求合併所有有交集的區間。注意如果在端點處相交,也算有交集。輸出合併完成後的區間個數。例如 1,3 和 2,6 可以合併為乙個區間 1,6 輸入格式 第一行包含整數n。接下來n行,每行包含兩個整數 l 和 r。輸出格式 共一行,包含乙個整數,表示合併區間...