结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量
结构体的声明及格式
例如描述一个学生:
struct student
{
char name[20]; 姓名
int age; 年龄
char sex[5]; 性别
char id[20] 学号
}Stu;
以上这种,成员变量的集合就是结构体 意思就是: 定义了一个结构体类型:struct student 定义结构体类型的同时定义了 此类型的变量:Stu,是全局变量 姓名,年龄,性别,学号就是他的成员,也就是这个类型struct student有4个成员,成员可以是数组,整型,浮点型,标量,指针,其他结构体等
还可以利用typedef定义结构体 如:
struct Stu 结构体的类型
{
char name[40]; 结构体的成员1
int age; 结构体的成员2
char sex[10]; 结构体的成员3
float score; 结构体的成员4
}s1,s2,s3; 此类型的变量名——是全局变量
struct Student
{
char name[40];
int age;
char sex[10];
float score;
};
typedef struct Student Stu1
或者
typedef struct
{
char name[40];
int age;
char sex[10];
float score;
}Stu2; 上面没有定义类型名则这里必须要有
int main()
{
struct Stu s4;
struct Stu s5;
struct stu是类型,不可随意省略struct
s4,s5,是局部变量,是在函数里创建的
利用typedef
Stu1 p1; Stu1和Stu2就是结构体类型名
Stu2 p2; p1,p2就是其变量
}
结构体的初始化
结构体的初始化及嵌套时的初始化如下:
struct Point
{
int x;
int y;
}p1 = {1,15}; 定义时用 { } 初始化赋值
struct S
{
char c;
struct Point sp; 如函数声明一样,做到先声明后使用
double d;
char arr[20];
};
int main()
{
struct Point p2 = {100,200};
struct S ss = {'W',{10,20}, 5.5,"hello"};这里用到了结构体的嵌套
return 0; 在函数中定义了之后可以对其进行初始化
}
可以像p1一样在创建时初始化。也可以在函数中初始化
一般不需要赋值时,可以初始化为{0};
结构体的成员访问及传参
这里继续用上一条代码来解释 :
struct Point
{
int x;
int y;
}p1 = {1,15};
struct S
{
char c;
struct Point sp;
double d;
char arr[20];
};
void print1(struct S temp1)
{
printf("%c\n",temp1.c);
printf("%d,%d\n",temp1.sp.x,temp1.sp.y);
printf("%lf\n",temp1.d);
printf("%s\n",temp1.arr);
}
void print2(struct S* temp2)
{
printf("%c\n",temp2->c);
printf("%d,%d\n",temp2->sp.x,temp2->sp.y);
printf("%lf\n",temp2->d);
printf("%s\n",temp2->arr);
}
int main()
{
struct Point p2 = {100,200};
struct S ss = {'W',{10,20}, 5.5,"hello"};
print1(ss);
putchar('\n');
print2(&ss);
putchar('\n');
return 0;
}
由上可知:
1.当结构体是普通变量时,用 结构体变量名+ “.” 引用具体某一个成员
2.当结构体变量是指针时,用 结构体变量名+ “->” 引用具体成员
注意当给指针变量传参时 要加上取地址符&
temp2->sp.x,temp2->sp.y
这条语句是,先用指针指向成员sp的地址,而sp又有两个成员,再通过“.” 引用
可能会遇到的问题:
上述代码中,当想改变arr里的字符串时该如何赋值
即,当成普通字符串处理,使用strcpy函数或scanf函数等
因为 ss.arr = "world"; 这种赋值只是操作数组的一个元素,例如arr[0],只收到一个字符
总结
1.要注意定义结构体时最后的 “ ; ”符号 2.使用typedef时结构体名,变量名必须要有一个 3.注意结构体的局部变量和全局变量 4.注意传参时需要传地址 5. “ —> ” 等同于 “ * ” 的解引用 6. 注意给字符串赋值的方式
|