陣列與指標

2021-10-08 20:35:37 字數 2238 閱讀 4274

我們先來看乙個簡單的小例子:

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元素的陣列。其實這兩種寫法主要是因為運算子的優先...