C語言之一維陣列

2021-10-10 05:04:33 字數 2278 閱讀 4992

在工作中又遇到和陣列,指標有關的**了,我看的有點懵,但是我明白陣列和指標肯定是擁有完全不同的特徵的。先從陣列下手吧,好好回顧一下,查漏補缺。

下面定義乙個陣列。

int num[3];
我們大多數時候都會使用到陣列名。但是你真的清楚陣列名是什麼型別嗎?

首先,num[1]毫無疑問是int型別,那麼num是什麼型別?它到底表示了什麼?

在c中,絕大多數時候(有例外情況,下文我們會討論),陣列名是乙個指向***型別的指標常量。例如num,它的型別應該是指向int型別的指標常量。但是這並不是說陣列和指標是相同的。當陣列名在表示式中使用的時候,編譯器會給它產生乙個指標常量。例如num,會被編譯器處理為int *const num。即num只能指向固定的記憶體區域。這也是合理的,如果你能改變num的指向,那麼就必須移動整個陣列(因為陣列是一段連續的記憶體空間)。也就是說陣列名不代表整個陣列,切記。

當陣列名作為sizeof操作符或是&(取位址)操作符的運算元時。

sizeof(num);          返回整個陣列的長度,而不是指標的長度。故應該返回12,而不是指標的大小。測試如下所示。

**:

#include using std::cout;

using std::endl;

int main()

; cout << sizeof(num) << endl;

return 0;

}

執行結果:

#        這個操作產生的是乙個指向陣列的指標(int (*num) [3]),而不是乙個指向某個指標常量的指標。例如:

很明顯,對陣列名取位址,產生的是乙個 int (*)[3]的型別,而不是乙個指向指標的指標。正確的使用如下所示,但是不建議這麼使用。

除了上述兩種例外情形,其餘時候,陣列名只是乙個指標常量,也就是陣列起始元素的位址。

#include using std::cout;

using std::endl;

int main()

; cout << num[1] << endl; //下標引用

cout << *(num + 1) << endl; //間接訪問

return 0;

}

執行結果:

上面的**表明,下標引用和間接引用並沒有任何不同。

下面在看一些詭異的寫法,這些寫法將會導致程式的可讀性,維護性大大下降。

int num[3] = ;

int* p = &num[1];

cout << p[-1] << endl; //使用負數作為下標,輸出結果是num[0],也就是1

cout << 2[num] << endl; //2[num] == num[2]

這段**是合法的,能夠通過編譯,但是我們不應當在程式中書寫這類**。但是有的人在硬體驅動程式中可能書寫了這樣的**,所以我們可能還是需要理解這些**。

陣列做函式引數時,我們一般將陣列名作為引數傳遞給函式,也就是說傳遞給了函式指向該陣列起始元素的指標。因此很容易就明白了,這是把指標拷貝了乙份,而非整個陣列。所以,我們說在c中所有傳遞給函式的引數都是通過傳值方式進行的。因為,陣列名在作為函式引數進行傳遞的時候,實際上乙個指標。

不過編譯器為了我們編寫**方便, 支援陣列形式的函式形參。因此,下面的兩種形式宣告是等價的。

int function(int *num);

int function(int num);

我們並沒有在num的中寫上陣列長度,實際上,你寫上也可以。但是這在一維陣列這裡無關緊要。因為這傳遞的是指標,而不是整個陣列,所以,如果函式需要知道陣列的長度,那麼長度必須作為乙個顯式的引數傳遞給函式。如下所示:

int function(int* num, unsigned int len);

C語言之一維陣列1 2 三大排序

基本思想 兩個數比較大小,小的數放在大的數前面 公升序 實現流程 1 比較相鄰的兩個陣列元素a和b,如果a b,就交換a b的位置,否則不做改變。2 從後往前對陣列元素進行兩兩比較,一直到最前兩個的兩個元素。最終陣列中最小值被交換到起始的位置。include define size 10 void ...

C程式語言之一

d 按照十進位制整形數列印 o 按照八進位制整形數列印 x 按照十六進製制整形數列印 c 表示字元 s 表示字串 表示 本身列印 ld long型輸出 幻數 define 名字 替換文字 define num 100 i,比i 更精煉 兩者的區別 i,不會產生乙個中間暫存器變數來儲存變數 i 產生乙...

c語言之一維指標的理解和應用

我們通常說的指標其實應該叫做指標變數,是一種用來 獲取 和 儲存 其他變數的位址的變數。其他變數可以是 整形,字元型 指標型 型別,結構體型別。簡而言之,指標給我們提供一種訪問位址的方式。也就是可以視為 指標 就等價於 位址。對於乙個新的名詞來說明白這個新東西的作用是十分重要的,我們可以用它簡化很多...