2013-03-21 31 views
3

您好朋友我在練習結構。我有這兩個函數返回結構,我將它複製到main中的本地結構。我的第二個函數通過輸入不同的實體來改變這些本地結構成員 現在我打印結果後,調用每個功能,令我驚訝,我注意到,兩個函數後的打印結果是相同的。我無法理解這裏發生了什麼......請你們解釋我......謝謝!如何更改傳遞給函數的結構的值

#include <stdio.h> 
#include <stdlib.h> 

struct student{ 
     char name[30]; 
     float marks; 
     }; 


struct student read_student(); 
void read_student_p(struct student student3); 
void print_student(struct student student2); 

int main() 
{ 
    struct student student1; 
    student1 = read_student(); 
    print_student(student1); 
    read_student_p(student1); 
    print_student(student1); 
    system("pause"); 
    return 0; 
} 

//This is my first function 
struct student read_student() 
{ 
     struct student student2; 
     printf("enter student name for first function: \n"); 
     scanf("%s",&student2.name); 

     printf("enter student marks for first function:\n"); 
     scanf("%f",&student2.marks); 

     return student2; 
} 

//function to print 
void print_student(struct student my_student) 
{ 
    printf("Student name in first function is : %s\n",my_student.name); 
    printf("Student marks in first function are: %f\n",my_student.marks); 
}; 

//My second function 
void read_student_p(struct student student3) 
{  
     printf("enter student name for second function: \n"); 
     scanf("%s",&student3.name); 
     printf("enter student marks for second function: \n"); 
     scanf("%f",&student3.marks); 
} 
+2

會發生什麼,你期望發生什麼? – Patashu 2013-03-21 03:04:38

+0

即使在調用第二個函數後,它也會打印相同的名稱和標記......您可以看到,在第二個函數中,我們再次輸入新名稱和新標記....我期望它能夠打印 – studyembedded 2013-03-21 03:07:36

回答

6

你的意思寫

void read_student_p(struct student* student3) 
           ^
{  


read_student_p(&student1); 
      ^

您需要將指針傳遞給read_student_p如果要修改要傳遞的struct。目前它通過價值傳遞,並且修改已丟失。

考慮_p後綴,我希望這是打算..

+0

感謝兄弟,我明白了.. 。謝謝! – studyembedded 2013-03-21 03:11:25

0

當你這樣做:

read_student_p(student1);

,並且該方法是這樣的:

void read_student_p(struct student student3) 
{  

    printf("enter student name for second function: \n"); 
    scanf("%s",&student3.name); 
    printf("enter student marks for second function: \n"); 
    scanf("%f",&student3.marks); 

} 

的Structs在C中按價值傳遞,而不是通過引用。

因此,read_student_p所做的是獲取您在(student1)中傳遞的結構的副本,編輯副本,然後不執行任何操作。

一個解決方案是返回結構的變化版本。另一個版本是將指針傳遞給結構體,並通過指針編輯結構體(以便直接編輯結構體的相同副本)。

0

read_student_p你被價值,這就是調用第二個函數,你在函數中定義一個新的結構體變量tmp,並複製的student1值這個TMP值。您所做的所有修改均在tmp值上,這不會影響student1

相關問題