c++字符指針


  對於C/C++中的 字符指針和字符數組,總是在碰到的時候無法確定而不得不現場測試,來確定末尾是否包含'\0',函數到底如何使用等等。真是勞民傷財,現在總結一下:

字符指針的賦值

(1)指向一個字符串常量

char *src = "abcded"; //這種方式由系統自動給該字符指針指定了一個內存中的位置,並且該位置的字符數組為{'a', 'b', 'c', 'd', 'e', 'd', '\0'};

如果此時再次對 src賦值,src = "mmmt", 則src指向另外一個由系統指定的內存塊。這種方式賦值的src為一個指向字符串常量指針,不能對src指向的位置的內容做改變的操作,即不能執行 *src = 'a', *(src+1) = 't' 等操作;但是可以改變src指向的位置,即像之前的 src = "mmmt";

(2)指向一個字符數組

char tmp[4] = {'a', 'c', 'e', 'f'};

char* src = tmp;  

(3)使用  new,然后可以像字符數組一樣賦值,即指向一個字符數組

char* src = new char[10]; //這種方式由程序在堆內存上開辟了一個數組,並將地址賦值給src

 

字符串常量和字符數組比較

(1)字符串常量由系統自動分配一個內存區域,且該區域中的內容不能改變(即無法通過指向該字符串的指針進行修改);

(2)字符數組或者為系統自動分配的全局數據區或棧上的內存,或者通過new操作來分配的堆上的內存,字符數組中的內容可變(即可以通過指向該字符數組的指針進行修改)。

(3)字符數組中不默認含有'\0',除非明確賦值,而字符串常量在末尾自動含有 '\0'.

 

strcpy的使用

(1)用strcpy時候, 如果源字符串是一個字符指針,則沒有問題,因為字符指針自動帶'\0',在'\0'位置復制結束;

  而如果源是一個字符數組(即將字符數組轉換為字符指針來使用),則將會從字符數組的首地址開始復制,如果字符數組中明確指定了'\0'元素,則會在'\0'處停止,而若沒有'\0'元素,則程序可能會不停的復制,直到在程序的內存中碰到'\0',這樣可能會得到不希望的結果。

(2)用strncpy的時候注意,這里只管復制n個字符,如果前n個字符中含有'\0',則會在'\0'處停止,否則,一直復制n個。

  在寫程序的時候,如果目的字符串之前沒有被memset清空,下次使用strncpy來為它賦值,則有可能它之前的長度大於n,則會導致不期望的結果。比如

char* dst = "abcdedf";

char* src = "12345";

strncpy(dst, src, 3);

則dst此時變為了 123dedf

 


免責聲明!

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



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