- 字符数组定义字符串
- 定义示例:
char str1[] = "Hello, World!";
- 存储方式:字符数组在内存中分配一段连续的空间,用于存储字符串的每个字符,包括字符串结束符
'\0'
。这段空间的大小是字符串实际长度(包含'\0'
)。
- 访问方式:可以通过数组下标来访问每个字符,例如
str1[0]
获取'H'
,str1[1]
获取'e'
等。也可以使用指针算术运算来访问,如*(str1 + 0)
获取'H'
。代码示例:
#include <stdio.h>
int main() {
char str1[] = "Hello, World!";
for (int i = 0; str1[i] != '\0'; i++) {
printf("%c ", str1[i]);
}
return 0;
}
- 字符指针定义字符串
- 定义示例:
const char *str2 = "Hello, World!";
(这里建议使用const
修饰,因为字符串字面量通常是只读的)
- 存储方式:字符指针本身存储的是字符串常量在内存中的起始地址。字符串常量存储在只读数据段(某些编译器环境下),它是不可修改的。
- 访问方式:通过指针间接访问每个字符,如
*(str2 + 0)
获取'H'
,*(str2 + 1)
获取'e'
等。也可以通过下标形式str2[0]
,str2[1]
访问,但本质还是指针运算。代码示例:
#include <stdio.h>
int main() {
const char *str2 = "Hello, World!";
for (int i = 0; *(str2 + i) != '\0'; i++) {
printf("%c ", *(str2 + i));
}
return 0;
}
- 区别总结
- 存储位置:字符数组中字符串存储在栈上(局部数组)或静态存储区(全局数组),且内容可修改;字符指针指向的字符串常量通常存储在只读数据段,不可修改(除非去掉
const
修饰,但这是不安全且不推荐的)。
- 内存分配:字符数组分配连续内存用于存储字符串;字符指针仅分配存储指针的内存,字符串常量存储另有位置。
- 可修改性:字符数组可对单个字符进行修改,如
str1[0] = 'h';
;而对字符指针指向的字符串常量进行修改(如*(str2 + 0) = 'h';
)会导致运行时错误,因为其存储在只读区域。