陣列是型別相同的物件的序列,其中的物件稱為陣列元素。
陣列是c/c++中最常用的資料結構,由於陣列名類似於指標,加上c/c++不會對陣列邊界進行檢查,所以在陣列運用過程中很容易出錯。
下面總結下自己對陣列的理解:
1. 陣列名是乙個"常量位址"(函式名也是),不能作為左值。
(按道理是不能對陣列名再「取位址」的,編譯系統做了「容錯」處理,就是把「取常數字址的位址」與「常數字址」等價成一回事,如把 &hello處理成與 hello等同 , 所以,它們是一樣的,編譯程式這樣做是故意的行為,僅僅是為了「容錯」。)
資料名作為函式形參時,其全面淪落為乙個普通指標。在失去其內涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。
為什麼字元陣列輸出陣列名為陣列內容,而不是位址?
輸出字元陣列時,就會把首位址轉換成char *p的,以字串的形式輸出。
2.陣列傳值(址)
一維陣列,可以直接作為引數傳值(同時傳陣列長度或定義結束標誌)。
二位陣列,可以轉換為指標陣列(char c[1][2] 轉為 char (*c)[2]),再進行傳遞。
三維或以上,分解為一維陣列(char c[1][2][3] 轉換為 char (*(*c))[3]),再進行傳遞。
陣列名做形參時,是傳值還是傳址?
陣列就是一塊記憶體, 陣列名就是記憶體的首位址, 和指標是一樣的, 傳參傳陣列, 其實就是傳了個指標, 不會複製乙份的,
3.陣列和指標
陣列和指標被編譯器按照不同方式處理,產生不同的**;對於編譯器來說,乙個陣列就是乙個位址,而指標是乙個位址的位址。
例如p[3]和*(p+3)都得到一樣結果,但訪問過程不一樣,指標其實是多了一步,就是指標必須先去取它的位址的內容;而陣列不用,直接加偏移位址取元素就可以了。
4.陣列越界,strcpy
c/c++並不會對陣列邊界進行檢查,當對陣列賦值大於陣列長度時,就會覆蓋周邊變數的值。
注意:在使用strcpy時,陣列不能作為源引數(const char *src),因為對src的拷貝以'\0'作為終止符,陣列沒有'\0',就會越界一直往下找,直到找到為至。
char *strcpy(char *dest, const char *src);
5.零長度陣列應用
零長度陣列不是所有的c標準都支援,gnu c支援,ansi c不支援,c++不支援。
零長度陣列(通常是長度為1陣列)一般放在結構體的結尾,用於不定長資料的「動態擴充套件」,所以在給結構體分配記憶體時必須預先分配足夠的記憶體,保證後面擴充套件時不會超過預先分配的記憶體的大小。(結構體的裡面的資料在記憶體中按順序儲存的。)
#include /*測試陣列邊界*/
void test_array_boundary()
; char *p0 = array;//輸出p0包含a,b和之後的隨機值
char *p1 = "abcdefgh\0xyz"; //輸出p1不包含\0之後的值
char p[1];
for(int i = 0;i<0xffff; i++)
/*strcpy應用,輸出為隨機值
strcpy結束標誌是'\0',陣列是不以'\0'為結束標誌,所以這裡直到拷貝找到'\0'
*/void test_array_strcpy()
strcpy(string, str1 );
cout<
陣列簡單應用 陣列插入式複製 戀天小結
package 01 arraybasic 插入複製 如果需要在原有陣列基礎之上再進行新增資料,就是插入式複製 思路 1 確定乙個重點,既然是插入式複製,說明陣列的長度一定會更改 2 但是陣列一旦確定,長度不能更改,如果需要更長的陣列,就需要建立新的陣列 3 如果建立的是乙個新的陣列的話,該方法必須...
一維陣列應用
public class arraydemo system.out.println ch陣列的長度為 ch.length system.out.println intarray陣列的第2個元素為 intarray 1 system.out.println strarray陣列的第5個元素為 stra...
awk應用小結
awk 呼叫 第一種方式 命令列方式 awk f field separator commands input file s f域分隔符 是可選的,因為awk使用空格作為預設的域分隔符,因此如果要瀏覽域間有空格的文字,不必指定這個選項,如果要瀏覽諸如passwd檔案,此檔案各域以冒號作為分隔符,則必...