Day05:C语言数组存储结构与字符串详解
一、数组的存储结构
1. 数组变量的地址连续性
数组中的元素在内存中地址是连续的。
数组名非常重要,涉及指针与内存操作。
2. 数组名的含义
数组名表示首元素的地址。
示例:
int arr[5]; printf("%p\n", arr); // 输出首元素地址 printf("%p\n", &arr[0]); // 等价3. 数组名的类型
数组名有类型,但它是地址类型:
如果元素是
int,数组名类型为int *如果元素是
char,数组名类型为char *
4. 数组名的运算能力
指针运算遵循元素类型大小:
int *类型 +1 → 地址增加 4(假设 int 4 字节)char *类型 +1 → 地址增加 1
示例:
int arr[3]; printf("%p\n", arr + 1); // 地址 + sizeof(int)5. 数组名是否是变量
不是变量
是常量值,表示首元素地址
6. 取值运算符
*arr→ 取首元素值arr[n]→*(arr + n),访问第 n 个元素
二、字符数组与字符串
1. 字符数组
存储
char类型变量的数组可以用于存储字符串,是C语言中唯一可存储字符串的数组类型
2. 字符串(String)
由 0 个或多个字符组成,以
\0结尾。空串示例:
char empty[] = "";"hello"字符串一定有\0结尾,即"hello\0"
3. 字符串常量与变量
字符串常量:例如
"hello",存在程序只读区字符串变量:在 C 中没有独立类型,只能用字符数组实现
4. 存储字符串的数组示例
char str1[10] = "hello"; // 正确,可作为字符串使用 char str2[2] = {'h', 'i'}; // 不是字符串变量,没有 '\0' char str3[2] = "hi"; // ❌ 越界,"hi" + '\0' 需要 3 个空间5. 字符串操作
5.1 长度
长度不包含
\0字符示例:
#include <string.h> char str[] = "hello"; printf("%zu\n", strlen(str)); // 输出 55.2 复制
#include <string.h> char src[] = "hello"; char dest[10]; strcpy(dest, src);5.3 拼接
#include <string.h> char str1[20] = "hello"; char str2[] = "world"; strcat(str1, str2); // str1 -> "helloworld"5.4 比较
依次比较字符 ASCII 值
第一个不同字符决定大小
#include <string.h> printf("%d\n", strcmp("hello", "hi")); // <0,"hello" < "hi" printf("%d\n", strcmp("hello", "hello")); // 0,等于 printf("%d\n", strcmp("hello", "helloa"));// <0,"hello" < "helloa"🔑 总结
数组是连续内存存储,数组名是首元素地址的常量
字符数组是存储字符串的唯一方法
字符串必须以
\0结尾字符串操作包括长度、复制、拼接和比较
字符串比较基于 ASCII 码,长度和内容决定大小
