使用&时,scanf()中发生了什么?运营商?

时间:2011-09-11 01:03:58

标签: c pointers struct operators

我是C编程的新手,对以下几行代码有疑问。这发生在创建结构化影片的链接列表的上下文中:

struct film {
    char title[TSIZE];
    int rating;
    struct film * next;
}

int main(void)
{
    struct film * head = NULL;
    struct film * prev, *current;
    char input[TSIZE]; 

    // some code ommitted

    strcopy(current->title, input);

    puts("Enter your rating <0-10>");

    scanf("%d", &current->rating);
}

基本上我的问题是关于strcopy()和scanf()函数。我注意到使用strcopy时,第一个参数是使用成员访问运算符 - &gt;在指向结构的指针上。我相信strcopy的第一个参数应该是一个指向char的指针,所以当使用成员访问运算符时,我们是否获得了一个指向title的直接指针,即使title没有被声明为结构中的指针?

我很困惑这与scanf()调用的对比如何,我们使用&amp;运营商获取当前 - &gt;评级的地址。 scanf()获取结构指针的地址然后进行成员访问,还是结构成员'rating'的地址?为什么不直接传入指针strcopy()?

我想,在做&amp; current-&gt;评级vs&amp;(current-&gt;评级)之间有区别? &amp; current-&gt;是否对指针的地址进行评级(类似指针的指针?)。

提前致谢。

3 个答案:

答案 0 :(得分:2)

当您在C中将数组作为函数参数传递时,编译器实际上将指针传递给数组中的第一个元素。 arrayVar&arrayVar[0]相同。因此,strcopy函数的第一个参数是指向title指向的结构中字符数组current的第一个元素的指针。

当您将int传递给函数时,您只是传递变量的值,而不是指向它的指针。由于scanf需要一个指针,它将存储该值,因此您必须使用&来获取指向该变量的指针。 scanf的第二个参数是指向rating指向的结构中的整数current的指针。

答案 1 :(得分:2)

  

我们是否直接指向标题,即使标题未被声明为结构中的指针?

要完全掌握这个问题的答案,您需要了解数据如何存储在内存中。

基本上(为了保持这一点),计算机有一排内存块,每个部分都有一个地址(就像一排房子)。单个变量(如char A;)只有一个房子,因此是一个静态地址。变量数组(如char Arr [10])有多个房屋(全部连续)但数组(指针)本身一次只能指向一个房屋。

有点像使用磁带。所以当你说Array [1]你真的说'相对于第一个房子[0]时,向下移动到下一个房子[1]'(或者更技术上,内存地址加上指针大小的时间如何你想要移过的很多街区。)

  

scanf()是否接受结构指针的地址然后进行成员访问,还是结构成员'rating'的地址?

这是struct的成员,评级的地址。通常为了澄清解除引用,人们会使用括号,因此&amp;(current-&gt; rating),而不是传递当前(&amp; current),但通常编译器知道什么是被解除引用,尽管如果出现问题,包围可能会有所帮助。

  

为什么不直接传入指针strcopy()?

数组技术上是一个指针(多个房屋排序),其中 - 评级没有指针(一个房子,不需要)。如果你有一系列的整数,那么你就可以做到这一点。

答案 2 :(得分:1)

current->title已经是一个指针(类型为char[]),所以你不需要&运算符而current->rating不是指针(类型是一个int),所以你需要得到变量的地址(这是&运算符在这里做的事情。)