📜  为什么scanf()函数的字符串不使用“&”?(1)

📅  最后修改于: 2023-12-03 15:21:36.535000             🧑  作者: Mango

为什么scanf()函数的字符串不使用“&”?

在C语言中,scanf()函数是一个非常常用的输入函数。但是,有一个比较容易被新手忽略的问题就是:为什么输入字符串时不需要使用“&”。

scanf()函数格式字符串

首先,我们需要了解scanf()函数的格式字符串。格式字符串是用来告诉scanf()函数应该如何解析输入数据的。

scanf()函数的格式字符串中包含了各种格式控制字符,用于指定输入数据的类型。常用的格式控制字符包括:%d、%f、%c、%s等等。

当我们需要输入多个变量时,可以在格式字符串中使用多个格式控制字符。例如:

int a;
float b;
char c;
scanf("%d%f%c", &a, &b, &c);    // 输入一个整数、一个浮点数和一个字符

上面的代码中,我们使用了%d、%f和%c三个格式控制字符,分别指定输入数据的类型。在每个格式控制字符后面,我们使用“&”符号来指定变量的地址,以便scanf()函数将输入的数据存储到相应的变量中。

但是,当我们需要输入一个字符串时,格式字符串中就不再需要使用“&”符号了。例如:

char str[20];
scanf("%s", str);    // 输入一个字符串

我们可以看到,在上面的代码中并没有使用“&”符号,而是直接将字符串数组的名称作为参数传递给了scanf()函数。

字符串和指针

为什么在输入字符串时不需要使用“&”符号呢?要回答这个问题,我们首先需要了解字符串和指针的相关知识。

在C语言中,字符串是由一组字符组成的字符数组。字符串的真正结束标志是一个空字符('\0')。例如:

char str[] = "hello";

在上面的代码中,str是一个字符数组,它包含了5个字符和一个空字符。我们可以通过下标访问字符数组中的每个元素。例如,str[0]表示第一个字符,即'h';str[1]表示第二个字符,即'e'。

另一方面,指针是一个变量,用来存储变量的地址。我们可以使用指针来访问变量,也可以使用指针来传递变量的地址。例如:

int a = 10;
int *p = &a;    // 定义一个指针p,并将它指向变量a的地址
printf("%d\n", *p);    // 输出变量a的值,*p表示访问指针p指向的变量

在上面的代码中,我们定义了一个指针p,并将它指向变量a的地址。通过*p可以访问变量a的值。

数组名和指针

在C语言中,数组名也可以看作是一个指针。当我们使用数组名作为参数传递给函数时,实际上传递的是数组的首地址。例如:

void func(char *str)    // 定义一个函数,参数为指向字符类型的指针
{
    printf("%s\n", str);    // 输出字符串
}

int main()
{
    char str[] = "hello";
    func(str);    // 调用函数,将字符串首地址作为参数传递
    return 0;
}

可以看到,我们在调用func()函数时,并没有使用“&”符号,而是直接将字符串数组的名称作为参数传递给了函数。实际上传递的是数组的首地址,函数中的参数str就是一个指向字符类型的指针。

因此,当我们在使用scanf()函数输入一个字符串时,实际上传递的就是字符串的首地址,而不是字符串本身。所以,我们不需要使用“&”符号来获取字符串的地址,直接使用字符串数组的名称即可。

总结

在C语言中,当我们需要输入一个字符串时,可以直接将字符串数组的名称作为参数传递给scanf()函数,不需要使用“&”符号。这是因为,数组名在这里实际上被看作是一个指针,用来存储字符串的地址。