结构体指针:
定义:
struct 结构体名称 名字;
结构体名称 * 新名字=&名字;
或 结构体名称 * 名字=malloc(sizeof(struct 结构体名称));
堆空间动态输入学生成绩并排序输出
struct student
{
char *name;
float arr[3];
};
int main()
{
struct student* s=malloc(sizeof(struct student)*MAX) ;
for (int i = 0; i < MAX; ++i)
{
(s+i)->name = malloc(sizeof(char) * 21);
(s + i)->arr = malloc(sizeof(float) * 3);
printf("请输入学生姓名 成绩\n");
scanf("%s %f %f %f", (s + i)->name,&(s + i)->arr[0],&(s + i)->arr[1],&(s + i)->arr[2]);
}
for (int i = 0; i < MAX - 1; ++i)
{
for (int y = 0; y < MAX - i - 1; ++y)
{
float m = s[y].arr[0] + s[y].arr[1] + s[y].arr[2];
float n = s[y + 1].arr[0] + s[y + 1].arr[1] + s[y + 1].arr[2];
if (m > n)
{
struct student temp = s[y];
s[y] = s[y + 1];
s[y + 1] = temp;
}
}
}
for (int i = 0; i < MAX; ++i)
{
printf("姓名:%s 成绩:%0.1f 成绩:%0.1f成绩: %0.1f\n", (s + i)->name, (s + i)->arr[0], (s + i)->arr[1], (s + i)->arr[2]);
}
for (int i = 0; i < MAX; ++i)
{
free((s + i)->name);
free((s + i)->arr);
}
free(s);
return EXIT_SUCCESS;
}
结构体和函数
结构体作为形参:
void fun(struct student s)
{
strcpy(s.name,"小明");
s.age=29;
}
不改变实参的值,函数结束,形参销毁
结构体指针作为参数
void fun(struct student* s)
{
strcpy(s->name,"小明");
s->age=29;
}
传入的是实参的地址值,函数会改变实参的值
结构体作为返回值
struct student fun()
{
struct student s;
strcpy(s.name,"小明");
s.age=29;
return s;
}
接收函数返回值时,值也会发生传递
结构体指针作为返回值
struct student fun()
{
struct student s;
struct student*ss=&s;
strcpy(ss->name,"小明");
ss->age=29;
return ss;
}
接收的是函数返回的指针,函数内创建的变量会被销毁,所以指针指向的内存的值有可能会发生变化