1. 程式人生 > >char* 和 char[] 的區別

char* 和 char[] 的區別

一、程式碼

有關下面程式碼,p和q的區別是什麼:

int main(int argc, char *argv[])
{
    char* p = "Hello World";
    char q[] = "Hello World";
    return 0;
}

二、區別和解釋

p和q的區別是:

p 是一個指標,指向程式 只讀資料段 的”Hello World”,不可以通過p[x] = x 來賦值,因為不能改變只讀資料段的內容。
q 是陣列名,也是一個指標,指向棧上從 只讀資料段 拷貝來的 “Hello World”

從上面的描述,可以看到,q相對於p是多了一次拷貝的,具體也可以參考[1],[2],最好的方式是彙編gcc -s hello.c -o hello.s

彙編程式碼之後看看(如果需要彙編程式碼和c對比閱讀,可以使用gcc引數,gcc -c -g -Wa,-adlhn hello.c > hello.s,如果需要Inter風格,可以 -masm=intel):

這裡寫圖片描述

可以看到第一次指令:movq $.LC0, -8(%rbp) 直接把存在.LC0的只讀資料”Hello World”儲存在了暫存器rbp中。
第二次有兩個指令,分別是movabsq $8022916924116329800, %raxmovq %rax, -32(%rbp)第一句是吧Hello World[3]移動到了rax中,然後把rax的內容移動到了rbp棧基址暫存器中,也就是前面說的多了一次拷貝,這個操作相當於複製。

三、結論

對於程式中不需要修改的常量字串,定義成char *而不是char[],可以提升程式的效率,畢竟少一次拷貝,這種情況常見於日誌輸出的時候。char *init = "init success"char *p = "startup fail"等等。