文章標題

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";
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章