C語言歸納四-數組

目錄

一、數組的初始化

二、二維數組的定義、初始化賦值

2.1 定義

2.2 初始化賦值

三、C語言字符數組和字符串詳解

3.1 定義

3.2 字符串的輸入

3.3 字符串處理函數

四、C語言數組靜態動態討論

五、C語言數組越界問題

六、變長數組與普通數組

六、C語言數組的各種排序的代碼


一、數組的初始化

int a[4] = {20, 345, 700, 22};
int a[10]={12, 19, 22 , 993, 344};

 

當賦值的元素少於數組總體元素的時候,剩餘的元素自動初始化爲 0:

  • 對於short、int、long,就是整數 0;
  • 對於char,就是字符 '\0';
  • 對於float、double,就是小數 0.0。

二、二維數組的定義、初始化賦值

2.1 定義

2.2 初始化賦值

int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
按行連續賦值應該寫作:
int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};
也可寫作:
int a[][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};

三、C語言字符數組和字符串詳解

在C語言中,沒有專門的字符串變量即string類型,通常就用一個字符數組來存放一個字符串。

3.1 定義

char c[20]={'c', '  ', 'p', 'r', 'o', 'g', 'r', 'a','m'};  
// 給部分數組元素賦值,末尾沒有'\0',所以長度只有9,而不是10
// 如果用printf("%s",c);的方法輸出的話,會在結尾有亂碼
// 因爲'\0'是結束標識。
char str[30] = {"c.biancheng.net"};
char str[] = "c.biancheng.net";  //這種形式更加簡潔,實際開發中常用
末尾一般是有一個不顯示出來的'\0'的。,所以實際長度是t後還有一個'\0'。
注意,這個實際長度是指sizeof(str)/sizeof(char)。
strlen函數得到的長度是不包括'\0'的。

特別注意:

字符數組只有在定義時才能將整個字符串一次性地賦值給它,一旦定義完了,就只能一個字符一個字符地賦值了。

在很多編譯器下,局部數據的初始值都是隨機的、無意義的,而不是我們通常認爲的“零”值。

請看下面的例子:

char str[7];
str = "abc123";  
錯誤

str[0] = 'a'; str[1] = 'b'; str[2] = 'c';
str[3] = '1'; str[4] = '2'; str[5] = '3';
正確

在C語言中,字符串總是以'\0'作爲結尾,所以'\0'也被稱爲字符串結束標誌,或者字符串結束符。

'\0'是 ASCII 碼錶中的第 0 個字符,英文稱爲 NUL,中文稱爲“空字符”。該字符既不能顯示,也沒有控制功能,輸出該字符不會有任何效果,它在C語言中唯一的作用就是作爲字符串結束標誌。

3.2 字符串的輸入

  • scanf() 讀取字符串時以空格爲分隔,遇到空格就認爲當前字符串結束了,所以無法讀取含有空格的字符串。
  • gets() 認爲空格也是字符串的一部分,只有遇到回車鍵時才認爲字符串輸入結束,所以,不管輸入了多少個空格,只要不按下回車鍵,對 gets() 來說就是一個完整的字符串。換句話說,gets() 用來讀取一整行字符串。

3.3 字符串處理函數

(1)字符串連接函數strcat()

strcat(arrayName1, arrayName2);

strcat() 將把 arrayName2 連接到 arrayName1 後面,並刪除原來 arrayName1 最後的結束標誌'\0'。這意味着,arrayName1 必須足夠長,要能夠同時容納 arrayName1 和 arrayName2,否則會越界(超出範圍)。

(2)字符串複製函數strcpy()

strcpy(arrayName1, arrayName2);

strcpy() 會把 arrayName2 中的字符串拷貝到 arrayName1 中,字符串結束標誌'\0'也一同拷貝。

(3)字符串比較函數strcmp()

字符本身沒有大小之分,strcmp() 以各個字符對應的 ASCII 碼值進行比較。

四、C語言數組靜態動態討論

PHP、JavaScript 等解釋型的腳本語言一般都支持動態數組,而 C、C++ 等編譯型的語言一般不支持動態數組。

插入和刪除數組元素都要移動內存,甚至重新開闢一塊內存,這是相當消耗資源的。如果一個程序中有大量的此類操作,那麼程序的性能將堪憂,這有悖於「C語言非常高效」的初衷,所以C語言並不支持動態數組。

五、C語言數組越界問題

如果下標小於零,就會發生下限越界(Off Normal Lower);如果下標大於等於數組長度,就會發生上限越界(Off Normal Upper)。

C語言爲了提高效率,保證操作的靈活性,並不會對越界行爲進行檢查,即使越界了,也能夠正常編譯,只有在運行期間纔可能會發生問題。由於C語言的”放任“,我們訪問數組時必須非常小心,要確保不會發生越界。

六、變長數組與普通數組

變長數組是C99標準支持的升級。它支持數組長度用變量聲明。例子如下:

#include <stdio.h>
int main()
{
    int n;
    printf("Input string length: ");
    scanf("%d", &n);
    scanf("%*[^\n]"); scanf("%*c");  //清空輸入緩衝區
    char str[n];
    printf("Input a string: ");
    gets(str);
    puts(str);
    return 0;
}

但是,注意,不是所有的編譯器都支持這種寫法,所以最好不要嘗試。

另外,注意,變長數組的數組內存是在程序運行後確定的,普通數組的內存是在程序編譯期間就分配好的。

六、C語言數組的各種排序的代碼

http://c.biancheng.net/view/1840.html

最適應的代碼還是王道上的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章