char *p;這句宣告(此處也是定義)了一個char*型別的變數,即一個字元指標變數,編譯器要在棧上分配出4個位元組的(sizeof(p) = 4,此處和後邊都是在32位時)空間來儲存p,注意此時p沒有初始化,這不是一個好習慣。
char *p = “abcde”;這句編譯器先在常量儲存區開闢6個位元組的空間來儲存”abcde”字元陣列,然後在棧上分配4個位元組的空間儲存字元指標變數p,並將其初始化,使p指向儲存”abcde”的那塊儲存區,我說的是字元陣列,是因為”abcde”的型別是const char [6]. (C語言裡的字串其實就是字元陣列,C++中的字串類是std空間裡的string類)。因為此時p指向的是常量儲存區,所以當然不可以p[0] = ‘A’。p和”abcde”根本就不在一塊儲存區,所以,若還有char *q = “abcde”,常量儲存區只儲存一份”abcde”,所以p和q的值相同。
char a[];這麼定義肯定不合法,沒指定長度,編譯器都不知道要分配多少空間才好。
char a[6] = “abcde”;(或者char a[] = “abcde”是一樣的,編譯器會自動計算長度)。這裡編譯器在棧上分配6個位元組的空間給a,(注意sizeof(a) = 6),就是說,a就對應著這6個位元組,從a[0]到a[5],並不需要額外的空間來儲存a。實際上,這句只是char a[] = {‘a’,’b’,’c’,’d’,’e’,’\0’}的簡寫而已。
在C語言中,存在一種decay rule,姑且叫退化規則吧,使陣列名a就像是一個指向第一個元素的指標(準確的說,是個指標常量),所以可以自動執行char *p = a;儘管p和a的型別不同。但是逆向的就不行,不能從char *自動轉換為char [6]!這裡需要說明的是a+1的型別是char *,所以不能a = a+1,因為型別不匹配。(另外char [6] 和char [8]是不同的型別).
我覺得討論陣列名是左值還是右值意義不大。一方面,char a[]= “abcde”;char b[6];b=a;這種將陣列置於賦值運算子的左邊,顯然不合理。另一方面,對a取地址&a卻完全是有意義的,(&a的型別是(char (*)[6])。
char *p;這句宣告(此處也是定義)了一個char*型別的變數,即一個字元指標變數,編譯器要在棧上分配出4個位元組的(sizeof(p) = 4,此處和後邊都是在32位時)空間來儲存p,注意此時p沒有初始化,這不是一個好習慣。
char *p = “abcde”;這句編譯器先在常量儲存區開闢6個位元組的空間來儲存”abcde”字元陣列,然後在棧上分配4個位元組的空間儲存字元指標變數p,並將其初始化,使p指向儲存”abcde”的那塊儲存區,我說的是字元陣列,是因為”abcde”的型別是const char [6]. (C語言裡的字串其實就是字元陣列,C++中的字串類是std空間裡的string類)。因為此時p指向的是常量儲存區,所以當然不可以p[0] = ‘A’。p和”abcde”根本就不在一塊儲存區,所以,若還有char *q = “abcde”,常量儲存區只儲存一份”abcde”,所以p和q的值相同。
char a[];這麼定義肯定不合法,沒指定長度,編譯器都不知道要分配多少空間才好。
char a[6] = “abcde”;(或者char a[] = “abcde”是一樣的,編譯器會自動計算長度)。這裡編譯器在棧上分配6個位元組的空間給a,(注意sizeof(a) = 6),就是說,a就對應著這6個位元組,從a[0]到a[5],並不需要額外的空間來儲存a。實際上,這句只是char a[] = {‘a’,’b’,’c’,’d’,’e’,’\0’}的簡寫而已。
在C語言中,存在一種decay rule,姑且叫退化規則吧,使陣列名a就像是一個指向第一個元素的指標(準確的說,是個指標常量),所以可以自動執行char *p = a;儘管p和a的型別不同。但是逆向的就不行,不能從char *自動轉換為char [6]!這裡需要說明的是a+1的型別是char *,所以不能a = a+1,因為型別不匹配。(另外char [6] 和char [8]是不同的型別).
我覺得討論陣列名是左值還是右值意義不大。一方面,char a[]= “abcde”;char b[6];b=a;這種將陣列置於賦值運算子的左邊,顯然不合理。另一方面,對a取地址&a卻完全是有意義的,(&a的型別是(char (*)[6])。