数组与字符串
字符数组、动态数组、缓冲区。
35 分钟
数组与字符串
C 没有独立字符串类型,字符数组与指针紧密相关。对照 /roadmaps/c,本课覆盖数组、C 字符串、string.h 及缓冲区安全。
学习目标
- 声明与遍历一维数组
- 理解数组名与指针的关系
- 使用 C 字符串与
string.h - 警惕缓冲区溢出
核心概念
数组与字符串
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_LINE 64
static void reverse(char *s) {
size_t i = 0, j = strlen(s);
if (j == 0) return;
j--;
while (i < j) {
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
i++;
j--;
}
}
int main(void) {
int nums[] = {10, 20, 30, 40, 50};
int n = (int)(sizeof nums / sizeof nums[0]);
for (int i = 0; i < n; i++) {
printf("nums[%d]=%d ", i, nums[i]);
}
printf("\n");
/* 字符数组:可修改 */
char greeting[MAX_LINE] = "Hello";
strncat(greeting, ", C!", MAX_LINE - strlen(greeting) - 1);
printf("%s (len=%zu)\n", greeting, strlen(greeting));
/* 字符串字面量:只读 */
const char *title = "CodeRoadMap";
printf("%s\n", title);
reverse(greeting);
printf("reversed: %s\n", greeting);
/* 动态「字符串」 */
char *buf = malloc(32);
if (buf) {
snprintf(buf, 32, "track=%s", title);
puts(buf);
free(buf);
}
/* 二维数组:3 行 4 列 */
int matrix[3][4] = {0};
matrix[1][2] = 99;
printf("matrix[1][2]=%d\n", matrix[1][2]);
return 0;
}
要点
| 主题 | 说明 |
|---|---|
| 数组大小 | sizeof arr / sizeof arr[0] |
| 字符串结尾 | '\0' 终止符 |
| 安全函数 | 优先 strncpy、snprintf,避免裸 strcpy |
| 数组 decay | 数组名在多数表达式中转为指向首元素的指针 |
strlen 不计 '\0';分配时需 len + 1 字节。
与 C++/Java 对照
| 特性 | C | C++ | Java |
|---|---|---|---|
| 字符串 | char[] / char * | std::string | String |
| 数组长度 | 编译期 / 手动跟踪 | std::array、vector |