初学者,能不能解释下为什么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这一情况?
推荐阅读:
相关文章