在C語言中,數組和字符串是基礎且重要的概念。它們用于存儲和操作一系列相同類型的元素或字符序列。
數組
1. 數組定義與初始化
數組是一系列相同類型的數據項的集合,這些數據項可以通過一個共同的名字來引用。數組中的每個元素都有一個索引(也稱為下標),從0開始計數。
定義:
type arrayName[arraySize];
示例:
int numbers[5];
定義了一個包含5個整數的數組。初始化:
- 在定義時初始化:
int numbers[] = {1, 2, 3, 4, 5};
- 或者指定大小并初始化:
int numbers[5] = {1, 2, 3};
?剩余元素自動初始化為0。
- 在定義時初始化:
2. 訪問數組元素
通過索引來訪問數組中的元素,如 arrayName[index]
。例如,numbers[0]
返回數組的第一個元素。
3. 多維數組
C語言支持多維數組,最常見的是二維數組,可以將其視為表格形式。
- 定義與初始化:
int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
一維數組的遍歷
#include <stdio.h>int main() {int arr[] = {10, 20, 30, 40, 50};int length = sizeof(arr) / sizeof(arr[0]); // 計算數組長度printf("數組元素為:\n");for (int i = 0; i < length; i++) {printf("arr[%d] = %d\n", i, arr[i]);}return 0;
}
數組可以分配在棧內存或堆內存中,具體取決于數組是如何聲明和定義的。
?
棧內存中的數組
當你在一個函數內部直接聲明一個數組時(即沒有使用動態內存分配函數如 malloc
),這個數組是分配在棧內存上的。棧內存是由編譯器自動分配和釋放的,它的生命周期與變量的作用域緊密相關。一旦函數執行完畢,棧上的數組所占用的內存會自動被釋放。
堆內存中的數組
如果你想在運行時確定數組的大小或者希望數組在其聲明的作用域之外繼續存在,你可以使用動態內存分配函數(如 malloc
, calloc
, realloc
)來在堆內存上分配數組。堆內存需要手動管理,意味著你需要明確地使用 free
函數來釋放你分配的內存,否則可能會導致內存泄漏。
- 棧:適用于大小固定、生命周期與作用域相關的數組。棧上的分配和釋放速度通常比堆快。
- 堆:適用于需要在運行時確定大小、或者希望其生命周期超出當前作用域的數組。不過,堆的分配和釋放相對較慢,并且需要程序員手動管理內存。
字符串
在C語言中,字符串實際上是一個以空字符 \0
結尾的一維字符數組。
1. 字符串定義與初始化
- 直接定義:
char greeting[] = "Hello";
- 或者手動添加終止符:
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
2. 字符串處理函數
標準庫提供了許多用于操作字符串的函數,需包含頭文件 <string.h>
。
strlen(s)
:計算字符串?s
?的長度。strcpy(dest, src)
:將字符串?src
?復制到?dest
。strcat(dest, src)
:將字符串?src
?連接到?dest
?后面。strcmp(s1, s2)
:比較兩個字符串?s1
?和?s2
。
3. 注意事項
- C語言不檢查數組越界,因此編寫代碼時要特別小心不要超出數組界限。
- 對于字符串,忘記添加結束符?
\0
?可能會導致未定義行為。
中文處理
使用?char[]
?+ UTF-8 編碼(推薦)
UTF-8 是互聯網通用編碼,支持中文,且兼容 ASCII。
示例:
#include <stdio.h>
#include <windows.h> // Windows onlyint main() {SetConsoleOutputCP(65001); // 設置控制臺輸出為 UTF-8char str[] = "你好,世界!";printf("%s\n", str);for (int i = 0; str[i] != '\0'; i++) {printf("%02X ", (unsigned char)str[i]);}printf("\n");return 0;
}
- 你的源代碼文件必須保存為?UTF-8?編碼(否則中文會亂碼)。
- 在 Windows 控制臺中顯示 UTF-8 中文時,可能需要設置控制臺編碼為 UTF-8:
- 在 編譯選項里,添加utf-8
選擇“配置屬性”“C/C++”>“命令行”屬性頁>。
在“附加選項”中,添加?選項以指定首選編碼。
/utf-8
選擇“確定”以保存更改 。