结构体:
指向结构变量和结构数组的指针
结构指针的计算以整个结构的大小为单位
访问结构的成员
通过结构变量访问其成员,用成员访问运算符“ . ”
通过结构指针访问其目标的成员,用间接成员访问运算符 “ -> ”
如果函数的参数是结构类型,那么形参只是实参的拷贝,在函数内部无法修改实参的成员
如果函数的参数是结构指针,并接受实参的地址,那么就可以在函数内部修改实参的成员
//结构体和函数的关系:作为函数的形参和返回值
//切记:将来函数操作结构体,函数的形参一定是指针
#include <stdio.h>
//声明结构体
typedef struct student {
char name[32];
int age;
}stu_t;
void show(stu_t st) { //st=stu
printf("%s, %d\n", st.name, st.age);
}
void grow(stu_t st) { //st=stu
st.age++; //操作的是形参变量st.age成员,没有修改实参变量stu.age成员
}
void show_p(stu_t *pstu) { //pstu = &stu
printf("%s, %d\n", pstu->name, pstu->age);
}
void grow_p(stu_t *pstu) { //pstu=&stu
pstu->age++; //通过pstu直接修改实参变量stu.age成员
}
stu_t get_student_info(void) {
stu_t stu = {"小白", 17};
return stu; //返回局部结构体变量stu的值
}
stu_t *get_student_info_p(void) {
//stu_t stu = {"大瓜", 16};
static stu_t stu = {"大瓜", 16};
return &stu; //返回局部结构体变量stu的地址,不允许
}
int main(void) {
stu_t stu = {"张少", 18};
show(stu);//传递结构体变量stu的值给show函数
grow(stu);//传递结构体变量stu的值给grow函数
show(stu);//传递结构体变量stu的值给show函数
show_p(&stu);//传递结构体变量stu的地址给show_p函数
grow_p(&stu);//传递结构体变量stu的地址给grow_p函数
show_p(&stu);//传递结构体变量stu的地址给show_p函数
stu_t stu1 = get_student_info();//用stu1保存函数返回的结构体值
printf("%s, %d\n", stu1.name, stu1.age);
stu_t *pstu = get_student_info_p();//用pstu保存函数返回的地址
printf("%s, %d\n", pstu->name, pstu->age);
return 0;
}
若定义的结构体指针函数中记录的数据用局部变量保存,则返回指针是局部变量,不允许,会报错,但若是返回静态变量则可以,这是生命周期的原因。