char a 與char a 的區別

2021-06-15 05:59:04 字數 1396 閱讀 5053

char *a = "hello" 中的a是指向第乙個字元『a'的乙個指標

char a[20] = "hello" 中陣列名a也是執行陣列第乙個字元『h』的指標

但二者並不相同:

看例項:把兩個字串相加:

結果:對比:

結果:把字串加到指標所指的字串上去,出現段錯誤,本質原因:*d="0123456789"存放在常量區,是無法修的。而陣列是存放在棧中,是可以修改的。兩者區別如下:

一. 」讀「 」寫「 能力

char *a = "abcd";  此時"abcd"存放在常量區。指標a只是靜態的,只能「」字串,而不具備對字串「寫"的本事。比如:a[0]='m'不正確,而char a[20] = "abcd"; 此時 "abcd"存放在棧,定義了陣列a,並且開了大小為20個字元空間,此時的陣列名a是指向第乙個字元'a'指標,它是動態的,可以對整個字串進行"讀寫」操作。比如a[0] = 'm'正確

二. 賦值時刻

char *a = "abcd"; 是在編譯時就確定了(因為為常量),而char a[20] = "abcd"; 在執行時確定

三. 訪問效率

char *a = "abcd"; 存於棧上。在棧上的陣列比指標所指向字串快。因此慢,而char a[20] = "abcd"; 存於棧上。快

另外注意:

char a = "01234",雖然沒有指明字串的長度,但是此時系統已經開好了,就是大小為6-----'0' '1' '2' '3' '4' '5' '\0',(注意strlen(a)是不計『\0』)

看一結構中出現的同樣的問題:

#includetypedef struct node

node;

void init(node *n)

int main()

這樣標記部分在呼叫init函式時會出現「

segment default", 因為此時 指標n是靜態的,只有「讀」的本事,不可以改變。

改為:

int main()

或:

int main()

char a 與char a 的區別

char a hello 中的a是指向第乙個字元 h 的乙個指標 char a 20 hello 中陣列名a也是執行陣列第乙個字元 h 的指標 但二者並不相同 看例項 把兩個字串相加 結果 對比 結果 把字串加到指標所指的字串上去,出現段錯誤,本質原因 d 0123456789 存放在常量區,是無法...

char a 與char a 的區別

char a hello 中的a是指向第乙個字元 a 的乙個指標 char a 20 hello 中陣列名a也是執行陣列第乙個字元 h 的指標 但二者並不相同 看例項 把兩個字串相加 結果 對比 結果 把字串加到指標所指的字串上去,出現段錯誤,本質原因 d 0123456789 存放在常量區,是無法...

char a 與char a 的區別

char a hello 中的a是指向第乙個字元 a 的乙個指標 char a 20 hello 中陣列名a也是執行陣列第乙個字元 h 的指標 但二者並不相同 看例項 把兩個字串相加 結果 對比 結果 把字串加到指標所指的字串上去,出現段錯誤,本質原因 d 0123456789 存放在常量區,是無法...