首页 > 解决方案 > 将值寻址到某个变量时“&”的重要性?

问题描述

我的老师告诉我们使用“&”来将值存储到我们想要的变量中,但是,我尝试使用 scanf(),我尝试将值存储到一些没有“&”的变量中,我注意到它仍然可以正常工作? 尽管我认为它没有影响我的代码吗?

这是我尝试过的代码。该代码是用于检查第二个输入是否为子字符串的部分。我的老师教的原始形式:

int main(){
    char word1[100], word2[100];
    int length1, length2;

    printf("Enter the a word: \n");
    scanf("%s", &word1);
    printf("Enter the potetial substring: \n");
    scanf("%s", &word2);

    for(length1=0; word1[length1]!='\0'; length1++);
    for(length2=0; word2[length2]!='\0'; length2++);

    if (length1<length2)
    {
        printf("Second input is not a substring.\n");
    }

然后我调整了程序要求输入的部分:

printf("Enter the a word: \n");
scanf("%s", word1);
printf("Enter the potetial substring: \n");
scanf("%s", word2);

即使我删除了“&”,我仍然得到相同的输出。希望有人可以解释此更改是否以我可能不知道的某种方式影响了我的代码,谢谢。

标签: c

解决方案


C 数组在评估上下文(例如传递给 的参数scanf)下表示为指向类型的指针,其中类型是数组的基础元素类型。因此word表示为char*。地址结果是第一个元素的结果。

然而,&word1评估为相同的地址,但输入到char (*)[100](因为这正是您所要求的)。它是同一个地址,因此scanf针对%s说明符仍然会“工作”(松散使用的术语)。

您的编译器应该发出警告,告诉您预期的参数类型是char*并且您正在给出char(*)[100]. 如果没有,请打开您的警告。

概括; 正确的语法%s是传递一个char*. 在这种情况下,这是通过word1(rinse/repeat for word2) 获得的。它可以使用 address-of 运算符工作,但没有理由在这种情况下使用它,而且完全有理由不使用它。


推荐阅读