C 为什么三种情况下的输出都相同?
有人能解释一下为什么下面三个片段的输出都是相同的吗。 数组的第0个元素究竟代表什么C 为什么三种情况下的输出都相同?,c,output,C,Output,有人能解释一下为什么下面三个片段的输出都是相同的吗。 数组的第0个元素究竟代表什么 int main(void) { char arr[10]; scanf("%s",&arr[0]); printf("%s",arr); return 0; } int main(void) { char arr[10]; scanf("%s",&arr[0]); printf("%s",&arr); return 0;
int main(void) {
char arr[10];
scanf("%s",&arr[0]);
printf("%s",arr);
return 0;
}
int main(void) {
char arr[10];
scanf("%s",&arr[0]);
printf("%s",&arr);
return 0;
}
int main(void) {
char arr[10];
scanf("%s",&arr[0]);
printf("%s",*&arr);
return 0;
}
arr[0]
表示数组的第一个元素arr
&arr[0]
是数组第一个元素的地址。在这三个代码段中,scanf
正在从标准输入读取字符串,并将存储在数组arr
中
在第一段中
printf("%s",arr);
将在数组arr
中打印存储的字符串%s
需要一个char*
类型的参数,&arr[0]
是该类型的参数,arr
也是该类型的参数,它将衰减为指向其第一个元素的指针
在第二个代码段中,&arr
是数组arr
的地址,类型为char(*)[10]
。使用错误的说明符将调用未定义的行为
在第三个代码段中,在&arr
上应用*
将其解引用回数组arr
的第一个元素的地址,该元素的类型如上所述为char*
Snippet first和third是正确的,在输入字符串不应大于10
个字符(包括'\0'
的条件下,将为相同的输入提供相同的输出。第三个代码将调用未定义的行为,在这种情况下不能说任何内容。&
(“的地址”)和*
(“取消引用指针”)相互抵消,因此*&foo
与foo
相同
你的第二个片段是错误的。它将&arr
(一个指向10个字符的数组的指针,char(*)[10]
)传递给printf
%s
,它需要一个指向char(char*
)的指针。恰好在您的平台上,这两种类型具有相同的大小,使用相同的表示,并以相同的方式传递到printf
。这就是为什么输出看起来是正确的
至于区别:arr
是一个字符数组。对数组求值(即在&
或sizeof
的操作数以外的任何位置使用该数组)将生成指向其第一个元素的指针
&arr
生成指向整个数组的指针。数组没有运行时结构(即,在运行时数组是其元素),因此数组的地址也是其第一个元素的地址。只是第一个元素比整个数组小,两个地址的类型不同。什么?第0个元素是第一个….'printf(“%s”,*&arr);'-这些垃圾是从哪里来的?我的意思是在这种情况下。这里我们传递第一个元素的地址,完整的字符串存储在arr缓冲区中。