为什么scanf中不需要地址运算符?

时间:2016-09-29 03:13:31

标签: c pointers scanf

为什么stud-> names.firstName不需要地址运算符? 但是& stud-> studentid?

需要地址运算符
struct student {
    struct
    {
        char lastName[10];
        char firstName[10];
    } names;
    int studentid; 
};


int main()
{  
    struct student record;
    GetStudentName(&record);
    return 0;
}

void GetStudentName(struct student *stud)
{
    printf("Enter first name: ");
    scanf("%s", stud->names.firstName); //address operator not needed
    printf("Enter student id: ");
    scanf("%d", &stud->studentid);  //address operator needed
}

1 个答案:

答案 0 :(得分:4)

这不仅不需要,而且不正确。因为数组 1 会自动转换为指针。

以下

scanf("%s", stud->names.firstName);

相当于

scanf("%s", &stud->names.firstName[0]);

所以在这里使用operator的地址是多余的,因为两个表达式都是等价的。

像使用"%d"格式说明符一样使用它 (这是错误的

scanf("%s", &stud->names.firstName);

会出错,实际上会出现未定义的行为。

注意:始终验证从scanf()返回的值。

1 也称为数组名称