char* 和 char[] 的區別

原文鏈接:https://blog.csdn.net/yangbodong22011/article/details/79606273

char* 和 char[] 的區別

本文鏈接:https://blog.csdn.net/yangbodong22011/article/details/79606273

一、代碼

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

int main(int argc, char *argv[])
{
    char* p = "Hello World";
    char q[] = "Hello World";
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

二、區別和解釋

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"等等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章