初學者,能不能解釋下為什麼char s[10];

scanf("%s",s);改為 scanf("%s",&s);也正確?


因為 (void*)s == (void*)s 。


假如你考了年級第一,那肯定也是班級第一。s為數組首元素地址(班級第一),s為整個數組起始地址(年級第一)。另外: s + 1,加了1個位元組。

s + 1,加了10個位元組。


char s[10];//這裡定義了char s[10]的類型scanf("%s",s);這裡s只要是一個合法的地址就可以了,而s, s在數值上是相等的,但是表達 的含義略有不同,s指向數組的首元素,而s指向s[10]整塊空間,整塊空間的開始地址和數組的首元素的地址肯定就是同一個值了

int main()
{
char s[10] = "abcdef";
printf("s:%x,s+1:%x,s+1:%x
",s,s +1,s + 1);
printf("s:%d,s+1:%d,s+1:%d
",sizeof(s),sizeof(s +1), sizeof(s + 1));
return 0;
}

運行結果:

注意運行結果s+1和s + 1,前面+1是加的sizeof(char),後面加1加的是sizeof(s)下面的printf裏s+ 1運行後的結果已經退化成char *
兩者類型不同,一個是數組類型,一個是指針類型。c標準要求:當其作為參數的時候兩者相同


數組名就是數組的地址,s[0]為數組第一個元素的地址,s為數組的地址,他們在數值上是相等的。
數組名是地址常量,其他的不是很記得。貌似對於char s[];的確有s == s這一情況?
推薦閱讀:
相關文章