字符串指针:
1 书写格式
const char* p = "abcdef";//必须使用const
内存四区包含代码区、栈、堆、全局区。全局区内存储常量、全局变量、静态变量,堆中存放使用new后者malloc动态申请存储空间 存储的变量,栈中存放局部变量,可由程序释放。
为什么要加const修饰符?因为 “aaaaa”字符串存储在 常量区,不能被改变。因此采用const char* p的形式。下面的做法是错误的:
p[0] = 'a';
2 访问
1)直接输出p,遇到\0停止输出
const char* p = "abcdef";
cout << p << endl;//直接输出
abcdef
请按任意键继续. . .
2)使用[]访问单个字符
const char* p = "abcdef";
cout << p[3] << endl;//使用[]访问
d
请按任意键继续. . .
p[0] = 'a';//此种写法是错误的
2 可修改指针指向的字符串
const char* p = "abcdef";
cout << p << endl;
cout << p[3] << endl;
p = "hijklmn";//修改指向
cout << p << endl;
system("pause");
abcdef
d
hijklmn
请按任意键继续. . .
3 可以对指针进行修改
const char* p = "abcdef";
cout << p << endl;
cout << p[3] << endl;
p = "hijklmn";
cout << p << endl;
p = p + 1;//指针修改
cout << p << endl;
system("pause");
abcdef
d
hijklmn
ijklmn
请按任意键继续. . .
总结:
字符串指针可以指向不同的字符串,但是不能修改字符串的值,类似于const char* p;
字符串指针可以进行运算,或者通过[]访问;
字符串指针可以直接通过输出指针来输出内容;
字符串指针=赋值时,要检查是否是NULL,并且先释放旧空间,并创建新空间;
字符串在全局区,而指针在栈。
字符数组:
1 书写格式
char str[] = "abc";
字符数组的名str,可以当成常量指针看待,类似于char *const p,也就是数组名不能执像指针似的指向新的字符串,也不可以做运算。可以修改的是分配的内存空间,其分配的内存空间在栈中,长度固定。
上面的形式,虽然是整体“abc”赋值,但是实际上是拆分开后进行的赋值:
char st[] = {
'a','b','c','\0' };
2 访问
cout << st[0] << endl;
cout << st << endl;
cout << st + 1 <<endl;
a
abc
bc
st = st + 1;//错误,st不能改变
st = "asd";//错误,不能像指针变量改变指向,只能通过一个一个元素的改变
总结:
字符串数组与字符串指针相反,可以更改字符串内容,但是不能进行整体赋值,只能一个一个的赋值,类似于char* const p;
字符串数组名称不能进行运算;
字符串数组内存空间在栈中。
参考文章:字符指针与字符串