2016-09-29 59 views
3

爲什麼地址運算符不需要stud-> names.firstName? 但是需要地址運算符& stud-> studentid?爲什麼在scanf中不需要address操作符?

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

的[爲什麼scanf()的需要和在某些情況下,運營商,而不是其他人?](HTTP可能重複://計算器.com/questions/3440406/why-does-scanf-need-operator-in-some-cases-and-not-others) –

回答

4

這不僅是不需要的,它是不正確的。因爲陣列會自動轉換爲指針。

以下

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

相當於

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

所以使用運營商這裏的地址是多餘的,因爲兩個表達式是等效的。

使用它就像你的"%d"格式說明
做(這是錯誤

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

將是錯誤的,實際上會發生未定義的行爲。

備註:始終驗證從scanf()返回的值。


又稱數組名

+0

爲什麼要採取這個地址是錯誤的?由於'firstName'是一個數組,我期望它能夠工作。但是,如果'firstName'是一個指針,它將不起作用。 –

+0

@RolandIllig它相當於取指針的地址。最重要的區別是指針算術會有所不同。 –

相關問題