Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么三种情况下的输出都相同?_C_Output - Fatal编程技术网

C 为什么三种情况下的输出都相同?

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;

有人能解释一下为什么下面三个片段的输出都是相同的吗。 数组的第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缓冲区中。