上一节课, 我们讲解了指向结构体的指针, 这次我们来讲讲, 结构体与函数~~
下面我们来看一个小例子:
#include <stdio.h> struct Student { int age; char *name; }; void test(struct Student s) { s.age = 30; s.name = "呵呵"; printf("age = %d name = %s ", s.age, s.name); } int main() { struct Student stu = {28, "小明"}; test(stu); printf("age = %d name = %s ", stu.age, stu.name); return 0; }输出结果:
有些人会有疑问, 我不是在调用函数的时候改了里面的值吗? 为什么输出的结果会不同呢??
其实原因很简单, 让我们来看看示意图:
首先, 两个结构体的地址是不相同, 所以改了里面的值, 外面的结构体并不会改变, 而代码里面的调用, 只是简简单单的把一个结构体成员的值对应赋值给另一个结构体成员而已, 所以输出的结果并不会相同, 同样, 下面这个例子也是一样, 让我们来看看:
#include <stdio.h> struct Student { int age; char *name; }; void test(struct Student *p) { struct Student stu2 = {15, "小李"}; p = &stu2; p->age = 25; p->name = "小黑"; printf("age = %d name = %s ", stu2.age, stu2.name); } int main() { struct Student stu = {28, "小明"}; test(&stu); printf("age = %d name = %s ", stu.age, stu.name); return 0; }
输出的结果:
让我们来看看示意图, 为什么输出的结果不一样:
一开始, 在main函数里, 传入进去的的确是stu的地址, 但是进到去test函数之后, p指针又指向了stu2的地址, 所以存的地址是sut2的, 而后面所改的值也是stu2的值, 所以stu输出的结果和原来的值一样, 而stu2输出的结果和原来的值不同.
还有另外一种使用方法, 我们来看看例子:
#include <stdio.h> struct Student { int age; char *name; }; void test(struct Student *p) { p->age = 30; p->name = "李四"; printf("p = %d p = %s ", p->age, p->name); } int main() { struct Student stu = {28, "小明"}; test(&stu); printf("age = %d name = %s ", stu.age, stu.name); return 0; }
输出的结果:
好了, 这次我们就讲到这里, 下次我们继续~~~