可以用数组和指针两种方式表示字符串
//数组
char str[] = "my string";
//指针
char *p_str = "my string";
但是它们的内存管理机制不同。
相同点:它们都是使用内存中的字符串"my string"。
不同点:使用数组是先把"my string"
的值拷贝一份再赋值到str
里。使用指针是使用p_str
指向内存中的某个已存在"my string"
的地址。
这意味着数组使用str[2] = '_'
这样的语句只会影响str
自己,因为它修改的是拷贝了的值,不会影响原有的"my string"
。
p_str[2] = '_'
这样的操作就会影响内存中的"my string"
,从而影响所有使用这个字符串的代码。比如有另一个指针char *p_str0
指向的是和p_str
相同的"my string"
,那么用p_str
修改了"my string"
的值,就会无意中影响到p_str0
以及其他用了这个内存存储的"my string"
的变量,这是我们不想发生的。 (现在有些编译器已经禁止指针进行这种修改个别字符的行为,即 p_str[2] = '_'
,但是改变整个指针的赋值是可以的,如 p_str = "another string"
)
下图展示了两者的主要区别:
1)需要修改字符串,用数组形式。
2)不需要修改字符串,用指针形式,并且加上关键字const
,防止自己不小心修改。
const char *p_str = "my string";