char* 和 char[] 的區別
阿新 • • 發佈:2019-01-28
一、程式碼
有關下面程式碼,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
可以看到第一次指令:movq $.LC0, -8(%rbp)
直接把存在.LC0
的只讀資料”Hello World”儲存在了暫存器rbp中。
第二次有兩個指令,分別是movabsq $8022916924116329800, %rax
和movq %rax, -32(%rbp)
第一句是吧Hello World
[3]移動到了rax
中,然後把rax
的內容移動到了rbp
棧基址暫存器中,也就是前面說的多了一次拷貝,這個操作相當於複製。
三、結論
對於程式中不需要修改的常量字串,定義成char *
而不是char[]
,可以提升程式的效率,畢竟少一次拷貝,這種情況常見於日誌輸出的時候。char *init = "init success"
,char *p = "startup fail"
等等。