在下面的程序中,当我传递一个结构变量来递减函数时,实际参数如何影响返回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);
}
答案 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]);