char * 和 char [ ] 的区别
char a[5] :编译器会给数组a分配5个单元,每个单元的数据类型为字符
char *s : 这是个指针变量,只占四个字节,用来保存一个地址
sizeof(a) = 5
sizeof(s) = 4
用一句话来概括,就是 char s **只是一个保存字符串首地址的指针变量
char a[] 是许多连续的内存单元,单元中的元素为char
之所以用 char *能达到 char a[] 的效果,还是字符串的本质,即给你一个字符串地址,便可以随心所欲的操所他。但是,
char* 和 char a[ ] 的本质属性是不一样的
char *a = “abc”;
char b[3] = { ‘a’,’b’ };
b[0] = ‘b’;
a[0] = ‘b’;
以上代码在运行时肯定会报错
char*a = ”abc“ 的 ”abc“ 是常量所以被分配在常量存储区,
a为字符指针类型是存放在栈区可以被更改,而常量存储区是不能更改的,是只读区域,所以当你试图去写入数据的时候,会报错。
而char b[3] = {‘a’,‘b’}的字符a和b是存放在栈区的所以可以进行写操作。
string
怎么理解string呢
我们可以把string 看作是 以字符为元素的容器 , 所有的元素构成字符串。
那么既然有了char * 和 char[] 为什么还要用string 呢 其中主要原因是:
1.当我们要存一个串,但是不知道其他需要多少内存时, 用string来处理就最好不过了。
2.string的内存管理是由系统处理,除非系统内存池用完,一般情况下,不用人为的去管理内存,
防止内存溢出等发生
string需要注意的地方:
string可以根据下标访问
不能将string直接赋值给char*
相互转化
#include <iostream>
#include <stdlib.h>
string str = "12345";
str.length() //5
string 转 const char* 两种方法, 切记是const char*
const char *s1 = str.data();
const char *s2 = str.c_str();
string 转 char*
int iLength = str.length();
char *s3 = (char*)malloc((iLength+1)*sizeof(char));
str.copy(s3,iLength,0);
free(s3);
string 转char []
char s4[iLength+1];
for(int i=0; i<iLength; i++)
{
s4[i] = str[i];
}
char *转string
char* q = "67890";
string qq = q;