nal*_*zok 3 c pointers scanf pointer-arithmetic
看下面的代码:
#include <stdio.h>
int main()
{
char str[80];
int n;
scanf("%s%n",str,&n);
printf("%s\t%d",str,n);
putchar('\n');
getchar(); //to remove '\n'
scanf("%s%n",&str,&n);
printf("%s\t%d",str,n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是输入和输出:
abc
abc 3
123
123 3
Run Code Online (Sandbox Code Playgroud)
我们知道,它scanf是一个可变参数函数,因此在调用它时它的参数不会被转换.因此,参数必须以与它们应该完全相同的类型传递.然而,类型strIS char *(从衰减char (*)[80]),而&str具有的类型char (*)[80],虽然它们具有相同的值,即&str[0].
那么为什么可以scanf("%s",&str);正常工作而不会因指针运算而导致段错误呢?
Tom*_*zes 10
两个指针值(str和&str)具有相同的二进制值,即地址str.但是,它们具有不同的类型:作为参数传递时,str转换为类型char *,而&str具有类型char (*)[80].前者是正确的,而后者是不正确的.它工作正常,但你使用的指针类型不正确,实际上gcc警告不正确的参数类型scanf.