陣列與指標

2021-07-31 11:41:49 字數 1459 閱讀 1506

陣列與指標

變數在記憶體存放是有位址的,陣列在記憶體存放也同樣具有位址。對於陣列來說,陣列名就是陣列在記憶體存放的陣列首元素位址。指標變數是用於存放變數的位址,可以指向變數,當然也可存放陣列的首址或陣列元素的位址,這就是說,指標變數可以指向陣列或陣列元素對陣列而言,陣列和陣列元素的引用,也同樣可以使用指標變數。

5.1陣列認知

c語言處理陣列的方式是它廣受歡迎的原因之一。c語言對陣列的處理是非常有效的,其原因有以下三點

(1)除少數編譯器出於謹慎會做一些繁瑣的規定外,c語言的陣列下標是在乙個很低的層次上處理的。但這個優點也有乙個反作用,即在程式執行時你無法知道乙個陣列到底有多大或者乙個陣列下標是否有效。 ansi/iso c標準沒有對使用越界下標的行為做出定義,因此,個越界下標有可能導致以下幾種後果。

程式仍能正確執行

程式會異常終止或崩潰;

程式能繼續執行,但無法得到正確的結果;

其他情況

換句話說,你不知道程式此後會做出什麼反應,這會帶來很大的麻煩。有些人就是抓住這一點來批評c語言的,認為c語言只不過是一種高階的組合語言。然而,儘管c程式出錯時的表現有些可怕,但誰也不能否認乙個經過仔細編寫和除錯的c程式執行起來是非常快的。

(2)陣列和指標能非常和諧地在一起工作。當陣列出現在乙個表示式中時,它和指向陣列中第乙個元素的指標是等價的,因此陣列和指標幾乎可以互換使用。此外,使用指標要比使用陣列下標快兩倍。將陣列作為引數傳遞給函式和將指向陣列中第乙個元素的指標傳遞給函式是完全等價的。將陣列作為引數傳遞給函式時可以採用值傳遞和位址傳遞兩種方式,前者需要完整地複製初始陣列,但比較安全;後者的速度要快得多陣列和指標之間的這種聯絡會引起一些混亂,例如,以下兩種定義是完全相同的

void func (chara [max] )

void func(char *a) {

/*...*/

注意:max是乙個編譯時可知的值,例如,用# define預處理指令定義的值

(3)這種情況正是前文中提到的第三個優點,也是大多數c程式設計師所熟知的。這也是唯種陣列和指標完全相同的情況,在其他情況下,陣列和指標並不完全相同。例如,當行如下定義(可以出現在函式說明以外的任何地方)時:

char a[max]

系統將分配max個字元的記憶體空間。當進行如下說明時:

char *a

系統將分配乙個字元指標所需的記憶體空間,可能只能容納2個或4個字元。假如在原始檔中進行如下定義

char a [max]

但在標頭檔案進行如下說明

extern char *a就會導致可怕的後果。為了避免出現這種情況,最好的辦法是保證上述說明和定義的一致性,例如,假如在原始檔中進行如下定義 

char a [max]

那麼應當在相應的標頭檔案中進行如下說明: 

extern char a

上述說明告訴標頭檔案a是乙個陣列,不是乙個指標,但它並不指示陣列a中有多少個元素,這樣說明的型別稱為不完整型別。在程式中適當地說明一些不完整型別是很常見的,也是一種很好的程式設計習慣。

指標與陣列,指標陣列 陣列指標

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