c語言中,指標是很重要的乙個功能,但想要用好指標卻不是一件容易的事,本篇從記憶體儲存的資料出發,通過對比變數與指標在記憶體中究竟是怎麼儲存的,來對指標有乙個直觀的認識。
下面編寫乙個測試程式來驗證一下,該程式定義了一些變數與指標,另外,還使用malloc函式來動態申請記憶體(普通變數是儲存在棧區,動態申請的變數在堆區,通過列印其記憶體位址可以看出差別)。
#include
#include
intmain()
; p2 = arr;
p3 =
(short*)
malloc(3
*sizeof
(short))
;//動態分配
p3[0]
=0x110a
; p3[1]
=0x220b
; p3[2]
=0x7fff
;printf(,
&a);
printf
("int a儲存的值: a = %#x\r\n"
, a)
;printf
("\r\n");
printf(,
&b);
printf
("char b儲存的值: b = %#x\r\n"
, b)
;printf
("\r\n");
printf(,
&p1)
;printf
("指標int *p1儲存的值: p1 = %#x\r\n"
, p1)
;printf
("指標int *p1指向的位址的值: *p1 = %#x\r\n"
,*p1)
;printf
("\r\n");
printf(,
&p2)
;printf
("指標char *p2儲存的值: p2 = %#x\r\n"
, p2)
;printf
("指標char *p2指向的位址的值: *p2 = %d\r\n"
,*p2)
;printf
("\r\n");
printf(,
&arr)
;printf(,
&arr[0]
);printf(,
&arr[1]
);printf(,
&arr[2]
);printf
("\r\n");
printf(,
&p3)
;printf
("指標short *p3儲存的值: p3 = %#x\r\n"
, p3)
;printf
("指標short *p3指向的位址的值: *p3 = %d\r\n"
,*p3)
;printf(,
&p3[0]
);printf(,
&p3[1]
);printf(,
&p3[2]
);printf
("\r\n");
return0;
}
測試程式輸出如下結果:
通過vc6.0軟體的除錯功能,可以檢視記憶體中的內容:
為便於分析,我做了一張對照圖,如下:
可以看到:
指標與變數的關係
定義變數 按型別分配空間 型別 變數名 型別 陣列名 陣列名 下標 1 指標與一維普通陣列 指標陣列 專門用於存放指標的陣列 型別 陣列名 長度 eg int buf 10 引用元素 陣列名 下標法 2 指標與二維陣列 int buf 10 int buf 3 4 一維陣列名 是指向該行第一列 bu...
C語言記憶體模型與指標以及變數的關係
記憶體模型 記憶體分割槽 圖 示例 include int gdata1 10 data int gdata2 0 bss int gdata3 bss段程序執行時,作業系統為.bss初始化為0 static int gdata4 11 data static int gdata5 0 bss st...
指標 指標變數與記憶體空間 解惑
指標 指標變數與記憶體空間 解惑 一年前,我曾今在chinaunix寫過一篇部落格 關於定義乙個指標與指標變數 然後搬家來了csdn。這篇部落格中寫道了很多關於指標和指標變數以及空間分配的一些常見錯誤。但是,到現在為止,無論是csdn的還是一些已經工作的同事以及大三大四的學生,陸陸續續的有人在問我關...