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 * 只是說指針指向的內容不可變,但指針本身可以再賦值
注意:看const 是放在*的左邊還是右邊 看const是修飾指針變量,還是修飾所指向的內存空變量
1 const char *p1 ; char * const p1 ; const char * const p1; //三者都不一樣
2 const int a; int const b; //const修飾 a b意義相同
3 const char *c; //const修飾c所執行的內存空間,c所值得內存空間不能被修改
4 char * const d; //d是一個常量指針;
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()
5.函數返回指向局部變量的指針,其指向的內容若不被保護,將會被系統回收內存(篡改內存數據)
1 #include "stdlib.h"
2 #include "string.h"
3 #include "stdio.h"
4
5 #define _CRT_SECURE_NO_WARNINGS
6
7 const char *getStr1() 8 { 9 const char *p = "abcd"; 10 printf("%s\n%p\n", p,p); 11 return p; 12 } 13
14 char *getStr2() 15 { 16 char str[] = "abcd"; 17 char *p = str; 18 printf("%s\n%p\n", p, p); 19 return p; 20 } 21
22 void main(void) 23 { 24 printf("getStr1():%s\n", getStr1()); 25 printf("getStr2():%s\n", getStr2()); 26
27 system("pause"); 28 }
1.getstr1(): const在編譯時候就確定好地址,其指向的內容不可更改。

2.getstr2(): char[]數組作為局部變量,在函數返回時內存會被系統回收,數據遭到篡改,無參考價值。

