目录
基础知识:
由于描述一个事物并非单方面的一个数字或一组相同类型的值,而是多个方面多种类型。例如描述一个人通过年龄,性别,电话号码等相关信息。因此在C语言中有结构体这个变量。数组是多个相同类型的数据的集合,而结构体则是多个不同类型的数据的集合。
定义:
typedef struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}Stu;
在这里,如果没有typedef,那么我们调用结构体时需要写struct stu,而如果有typedef struct stu,那么我们只需要写stu就可以了。而最下面的Stu ,就相当于int a里面的a一样,是一个实际创建的变量,我们也可以在主函数中进行创建和初始化。
结构体也可以嵌套定义,在一个结构体中定义另一个结构体
struct Node {
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL};
struct Node n2 = {20, {5, 6}, NULL};
结构体的访问:
当我们要访问的是结构体变量时,我们用 结构体名称.结构体内部成员 这个方式进行访问
当我们要访问的是结构体指针,我们既可以用(*结构体指针).结构体内部成员这种方式进行访问,另外一种比较简洁的方法是结构体指针->结构体成员
struct Stu
{
char name[20];
int age;
};
void print(struct Stu* ps)
{
printf("name = %s age = %d\n", (*ps).name, (*ps).age);
printf("name = %s age = %d\n", ps->name, ps->age);
}
int main()
{
struct Stu s = {"zhangsan", 20};
print(&s);
return 0;
}
结构体传参:
有两种方法可以对结构体进行传参,一种是直接给函数结构体变量,另外一种是给函数结构体的地址
struct S
{
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
void print1(struct S s)
{
printf("%d\n", s.num);
}
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s);
print2(&s);
return 0;
}
那么这两种方法谁优谁劣呢,答案是使用传结构体地址的方法比较好,因为在传输过程中,由于函数开辟在栈上,如果结构体太大,那么会造成压栈,而如果传地址只会传4个字节,因此以后大家在使用过程中推荐使用第二种。