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

时间:2013-03-21 03:02:46

标签: c

嗨朋友我正在练习结构。我有这两个函数返回结构,我将它复制到main中的本地结构。我的第二个函数通过输入不同的实体来更改这些本地struct成员     现在我在调用每个函数后打印结果,令我惊讶的是我注意到两个函数之后的打印结果是一样的。我无法理解这里发生的事情......你们能解释一下......谢谢!

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

3 个答案:

答案 0 :(得分:7)

你的意思是写

void read_student_p(struct student* student3)
                                  ^
{    


read_student_p(&student1);
               ^

如果要修改要传递的read_student_p,则需要将指针传递给struct。目前它按值传递,修改丢失。

考虑到_p后缀,我希望这是为了......

答案 1 :(得分: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);

 }

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

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

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

答案 2 :(得分:0)

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