char * 和 char [] 的區別
c++中內存分區
(1)堆(不同於數據結構中的堆)
由程序員手動分配和釋放的,分配方式似鏈表,在C++中由new分配,delete釋放。
(2)棧
由編譯器自動分配和釋放,存放函數的參數值,局部變量的值等。
(3)全局(靜態)存儲區
存放全局變量和靜態變量,有DATA段和BSS段分別存儲的是初始化變量和未初始化變量,程序結束後由系統自動釋放。
(4)文字常量區
常量字符串就是存放在這裏
(5)程序代碼區
存放函數體的二進制代碼
char * a1="hello";//語句1
char a2[]="hello";//語句2
語句1中,變量a1位於棧上,內容爲地址,指向文字常量區中的“hello”,即不可以通過a1改變文字常量區中的內容
語句2中,變量a2是棧上有6個元素的數組,其將“hello”拷貝到棧的內存中,所以可以通過a2對字符串進行改變,改變的是棧內存中的內容,而不是文字常量區中的內容。
測試代碼,測試環境 g++
#include <stdio.h>
int main(){
char * const a ="asdf"; //語句3
printf(" the value of a is :%s \n", a);
return 0;
}
warning
warning: deprecated conversion from string constant to
'char*' [-Wwrite-strings]
char * const a ="asdf";
warning原因:
char * 的含義是,給我一個字符串,我可以修改它。但實際上,無法通過char *指針對文字常量區的字符串進行修改,所以需要加上const進行修飾,告訴程序,這個字符串我只需要讀取。
將語句3中改爲
const char * const a="asdf";