C語言 char *、char []、const char *、string的區別與相互轉換


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[]數組作為局部變量,在函數返回時內存會被系統回收,數據遭到篡改,無參考價值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM