#include
#include
#include
typedef struct stu
{
char *name, gender;
int score;
} STU;
void f(char *p)
{
p=(char *)malloc(10);
strcpy(p, "Qian");
}
main()
{
STU a= {NULL, 'm', 290}, b;
a.name=(char *)malloc(10);
strcpy( a.name, "Zhao" );
b = a;
f(b.name);
b.gender = 'f';
b.score = 350;
printf("%s,%c,%d,", a.name, a.gender, a.score);
printf("%s,%c,%d\\n", b.name, b.gender, b.score);
}
则程序的输出结果是()。
A
Zhao,m,290,Qian,f,350
B
Zhao,m,290,Zhao,f,350
C
Qian,f,350,Qian,f,350
D
Qian,m,290,Qian,f,350
这题的考点其实就在这里:
“修改形参的值永远不会改变实参”
实参和形参其实跟两个变量赋值是一样一样的
比如int a=0;int b=a;b=2;那么b被修改了a并不会被修改,因为b只是a的一个拷贝。假如a是实参b是形参那么结果是一样的。
当a和b是两个指针的时候也是如此。
int c=0;int *a=&c;int *b=a;此时a和b这两个指针都指向c的地址,如果修改*a或*b修改的都是c的值。
而如果执行的是b=&(int *)malloc(1);将它重新指向一个新的内存,此时改变的是指针的值(指针的值就是地址),再改变b的时候就和c无关了。
也就是说,当b的值(指针地址)被改变时,并不会改变a
程序的输出结果是A:Zhao,m,290,Qian,f,350。
在这个程序中,变量b是通过对a进行拷贝得到的,因此它们的所有成员都是相同的。但是在函数f中,指针变量p被重新分配了内存,并且被赋值为字符串"Qian"。由于结构体变量b中的name成员是一个指针,因此b.name也会指向这块内存。
由于变量b的gender和score成员都被修改了,因此最终的输出结果为:Zhao,m,290,Qian,f,350。
其实主要是name这个变量为什么都是zhao的原因,其他两个没什么说的,
从结果中可以看出,两个name都是zhao,也就是说 void f()函数没有能改变b.name 的值
这是因为 函数传参进去的时候只是被拷贝了一个副本,在f函数内部对这个指针重新赋值不会对原本的指针产生影响
原本的指针还是一直指向和 a.name 相同的空间,所以当然不会变了