Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何更改传递给函数的结构的值_C - Fatal编程技术网

C 如何更改传递给函数的结构的值

C 如何更改传递给函数的结构的值,c,C,嗨,朋友们,我正在练习结构。我有两个函数,一个返回结构,我将其复制到main中的本地结构。我的第二个函数通过输入不同的实体来更改这些本地结构成员。 现在我已经打印了调用每个函数后的结果,令我惊讶的是,我注意到两个函数后的打印结果是相同的。我无法理解这里发生了什么…你们能给我解释一下吗…谢谢 #include <stdio.h> #include <stdlib.h> struct student{ char name[30]; fl

嗨,朋友们,我正在练习结构。我有两个函数,一个返回结构,我将其复制到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);
 }
#包括
#包括
结构学生{
字符名[30];
浮标;
};
struct student read_student();
无效阅读学生(结构学生3);
无效打印学生(结构学生2);
int main()
{
结构学生1;
student1=读学生();
印刷大学学生(学生1);
阅读(学生1);
印刷大学学生(学生1);
系统(“暂停”);
返回0;
}
//这是我的第一个函数
struct student read_student()
{
结构学生2;
printf(“为第一个函数输入学生姓名:\n”);
scanf(“%s”和student2.name);
printf(“为第一个函数输入学生分数:\n”);
scanf(“%f”和student2.marks);
返回学生2;
}
//打印函数
无效打印学生(结构学生我的学生)
{
printf(“第一个函数中的学生名是:%s\n”,我的学生名);
printf(“第一个函数中的学生分数是:%f\n”,my_Student.marks);
};
//我的第二个功能
无效读取学生(结构学生3)
{    
printf(“为第二个函数输入学生姓名:\n”);
scanf(“%s”和student3.name);
printf(“为第二个函数输入学生分数:\n”);
scanf(“%f”和student3.marks);
}
你想写什么

void read_student_p(struct student* student3)
                                  ^
{    


read_student_p(&student1);
               ^
如果要修改要传递的
结构
,则需要传递指向
read\u student\p
的指针。目前它是按值传递的,修改将丢失

考虑到
\u p
后缀,我认为这是您这样做的目的。

read\u 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\u student\p所做的就是复制一个你传入的结构(student1),编辑这个副本,然后什么也不做


一种解决方案是返回结构的更改版本。另一个版本是将指针传递到结构,然后通过指针编辑结构(这样您就可以直接编辑结构的同一副本)。

在第二个函数中,您通过值调用了read\u student\p
,也就是说,您在函数中定义了一个新的结构变量
tmp
,并将
student1
的值复制到此tmp值。您所做的所有修改都是在tmp值上进行的,这不会影响
student1

会发生什么,您希望会发生什么?即使在调用第二个函数后,它也会打印相同的名称和标记…您可以看到,在第二个函数中,我们再次输入新名称和新标记…我希望它会打印出来