如何在形式参数中修改结构变量

时间:2017-10-28 09:40:10

标签: c struct

在下面的程序中,当我传递一个结构变量来递减函数时,实际参数如何影响返回void。我做了类似的其他例子,发现当我把它作为形式参数传递时,结构值没有改变。这个例子是如何例外的..

/*P11.11 Program to understand how an array of structures is sent to a function*/
#include<stdio.h>
struct student
{
    char name[20];
    int rollno;
    int marks;
};
void display(struct student);
void dec_marks(struct student stuarr[], int a);
int main(void)
{
    int i,a=5;
    struct student stuarr[3]={
                                 {"Mary",12,98},
                                 {"John",11,97},
                                 {"Tom",13,89}
                               };
    dec_marks(stuarr,a);
    for(i=0; i<3; i++)
        display(stuarr[i]);

        printf("%d",a);
    return 0;
}
void dec_marks(struct student stuarr[], int a)
{
    int i;
    a=a+4;
    for(i=0; i<3; i++)
        stuarr[i].marks = stuarr[i].marks-10;
}
void display(struct student stu)
{
    printf("Name  - %s\t", stu.name);
    printf("Rollno  - %d\t", stu.rollno);
    printf("Marks  - %d\n", stu.marks);
}

1 个答案:

答案 0 :(得分:2)

这个例子不同,因为它没有传递要修改的结构,它传递了这样的结构数组:

void dec_marks(struct student stuarr[], int a)
//                            ^^^^^^^^
//                             Array

数组作为地址传递给它们的初始元素,相当于传递一个指针;不需要&运算符。另一方面,整数变量a按值传递,因此函数内的a = a+4赋值对main无效。

如果您重新构建程序以获取单个struct并将循环移至main,那么display(struct student stu)调用的方式将完成,那么您的程序将按预期停止工作。

// This does not work
void dec_marks(struct student stu) {
    stu.marks -= 10;
}
...
for(i=0; i<3; i++)
    dec_marks(stuarr[i]);