1.VS运行程序,出现“烫烫烫烫烫烫烫烫烫…”
在 Debug 模式下,
VC 会把未初始化的栈内存全部填成 0xcc,当字符串看就是 烫烫烫烫……
会把未初始化的堆内存全部填成 0xcd,当字符串看就是 屯屯屯屯……
2. VS不可以char *p=“abcd”
注意:编译器是把"abcd"作为“abcd\0”来处理的,有五个字符
为什么要加上’\0’?,‘\0’代表空格符,在字符串结尾加上‘\0’,代表字符串已经结束,读到\0的时候会停下来,不然会沿着内存地址一直读下去,读到什么乱七八糟的东西就不知道了,比如会读到类似 “烫烫烫烫”的东西
原因——“abcd”是字符串常量,不可更改,必须加上const用常量指针,即 const char *p = “abcd”
const char *p="hello"分配在静态存储区,不可以改变.
char p[]="hello"分配在堆上.
3.char *、char []、const char *、string 的区别
const char * 只是说指针指向的内容不可变,但指针本身可以再赋值
1.char * //字符指针,指向字符的指针
2.const char *,字符串常量,即像"aaa"这样的类型
3.string 是std::basic_string模板类的实例化,是一个类(C++的STL才有),string str=“aaa”; 其实是 const char *转class ,string重载了=号,把“aaa”封装成std::string
4.char a[8]; // a的类型是 char [8],如果是char a[6]; 则a的类型就是char [6] 既长度为N的字符数组
4.char *、char []、const char *、string 的转换
转化规律总结下:
1.转化成char[],可以用strcpy_s ,或者遍历字符串的方式
string 转char[] : strncpy_s(a, string.c_str(), N); 也可以用上图的遍历string
const char * 转char[] : strcpy_s(a, const char *); 也可以用上图的strncpy_s
char * 转char[] : strcpy_s(a, char *); 也可以用上图的strncpy_s
2.char[]变成别的,直接赋值
3.转化为std::string 最简单,可以直接=, 因为string太强大了,把=号重载了很多遍
4.const char *转化到 char * 使用const_cast<char *>
5.string转化为char * 用c_str()