我們先來看乙個簡單的小例子:
int mango[
100]
=;
#include
//extern int mango;
extern
int*mango;
intmain
(void
)
然後編譯執行看看執行結果是多少?
結果是產生了,coredump檔案,對記憶體訪問操作發生了問題。
然後我們看另一種方式:
列印出來了結果1和4,所以說陣列和指標在某些時候是不相等的。
指標陣列
儲存資料的位址
儲存資料
間接訪問資料,首先取得指標的內容,把它作為位址,然後從這個位址提取資料。如果指標有乙個下標[i],就把指標的內容加上i作為位址,從中提取資料。
直接訪問資料,a[i]只是簡單地a+i為位址取得資料
通常用於動態資料結構
通常用於儲存固定數目且資料型別相同的元素
相關的函式為malloc(),free()
隱式分配和刪除
通常指向匿名資料
自身即為資料名
陣列和指標都可以在它們的定義中用字串常量進行初始化。看上去一樣,但底層的機制卻不相同。
定義指標時,編譯器並不為指標所指向的物件分配空間,它只是分配指標本身的空間,除非在定義時同時賦給指標乙個字串常量進行初始化。例如,下面的定義建立了乙個字串常量(為其分配了記憶體):
char
*p =
"breadfruit"
;
注意只有對字串常量才是如此。不能指望為浮點數之類的常量分配空間,如:
float
*pip =
3.141
;// 錯誤,無法通過編譯
在ansi c中,初始化指標時所建立的字串常量被定義為唯讀。如果試圖通過指標修改這個字串的值,程式就會出現未定義的行為。在有些編譯器中,字串常量被存放在只允許讀取的文字段中,以防止它被修改。
我們先來看看正確的執行結果:
#include
#include
//extern int mango;
//extern int *mango;
//double *pip = 3.141;
char
*p =
"breadfruit"
;int
main
(void
)
然後我們在看看異常的結果:
出現了段錯誤,這也就驗證了上面的結論,不能通過指標修改字串常量。
陣列也可以用字串常量進行初始化:
char a=
"gooseberry"
;
但與指標相反,由字串常量初始化的陣列是可以修改的。其中的單個字元在以後可以改變,比如:
可以修改。
指標與陣列,指標陣列 陣列指標
int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...
指標陣列與陣列指標
1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...
指標陣列與陣列指標
呵呵,實在是厭倦了繞口的解釋。指標陣列,故名思義,就是指標的陣列,陣列的元素是指標 陣列指標,同樣,就是直想陣列的指標。簡單舉例說明 int p 2 首先宣告了乙個陣列,陣列的元素是int型的指標。int p 2 宣告了乙個指標,指向了乙個有兩個int元素的陣列。其實這兩種寫法主要是因為運算子的優先...