char 和 char 的區別

2021-08-17 05:10:26 字數 1256 閱讀 9669

一、**

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

int main(int argc, char *argv)

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

參考資料:

[1] what is the difference between char s and char *s?

[2] what is the difference between these initializations?

[3] 為什麼是hello world?

[4] x64彙編參考

[5] x64暫存器

char 和char 的區別

1 char是乙個陣列定義,char 是指標定義 也稱char為靜態陣列,char 為動態陣列 2 指標和陣列的區別 1 指標和陣列的分配 陣列是開闢一塊連續的記憶體空間,陣列本身的識別符號 也就是通常所說的陣列名 代表整個陣列,可以使用sizeof來獲得陣列所佔據記憶體空間的大小 注意,不是陣列元...

char 和char 的區別

char c abc c 0 t char c1 def c1 0 t err 首先c1是乙個指標,它只是指向 def 這個記憶體塊。而 abc 是乙個常量區,不可以對其進行更改。而c定義的是乙個陣列,在分配記憶體時,會自動給它分配四個位元組的位址,並且會進行乙份拷貝工作,此時分配是在棧區進行的,是...

char 和char 的區別

之前在用到char 和char,用到srtncat,讓char對char 進行新增時執行會崩潰,之後做了一些分析和練習,對char 和char有了更深的理解。下面附上一些測試資料。include include include using namespace std int main cout do...