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);
 }
4

3 回答 3

7

你的意思是写

void read_student_p(struct student* student3)
                                  ^
{    


read_student_p(&student1);
               ^

read_student_p如果要修改要传递的,则需要传递一个指针struct。目前它是按值传递的,并且修改会丢失。

考虑到_p后缀,我希望这是有意的..

于 2013-03-21T03:06:43.997 回答
1

当你这样做时:

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);

 }

C 中的结构是按值传递的,而不是按引用传递的。

所以 read_student_p 所做的是获取你传入的结构的副本(student1),编辑副本,然后什么都不做。

一种解决方案是返回结构的更改版本。另一个版本是将指针传递给结构,并通过指针编辑结构(以便您直接编辑结构的同一副本)。

于 2013-03-21T03:06:50.343 回答
0

read_student_p你按值调用的第二个函数中,也就是说,你tmp在函数中定义了一个新的结构变量,并将值复制student1到这个 tmp 值。您所做的所有修改都在 tmp 值上,这不会影响student1.

于 2013-03-21T03:08:06.617 回答