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 存放在常量區,是無法...