——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一、概念
结构体是一种构造类型,它是由若干个成员组成的,每一个成员可以是一个基本数据类型或者又是一个构造类型。结构体可以把功能相同的数据组织起来,存在一起,用的时候方便,而且在调用函数时,若传递参数较多,传一个结构体相对简单。
二、结构体定义
1.结构体一般定义形式
struct 结构体名{
类型名1 成员名1;
类型名2 成员名2;
类型名3 成员名3;
...
};
定义一个学生
struct Student {
char *name;
int age;
float height;
};
注意点:结构体定义时注意大括号后面有分号。
三、结构体变量的定义
1.先定义结构体类型,再定义变量。
struct Student {
char *name;
int age;
};
struct Student stu;
结构体变量名为stu
2.定义结构体类型的同时定义变量
struct Student {
char *name;
int age;
}stu;
结构体变量名为stu
3.省略类型名,定义结构体类型变量
struct {
char *name;
int age;
}stu;
结构体变量名为stu
四、结构体变量赋值
1.第一种赋值方式
struct Student stu;
//结构体变量名.成员
stu.name = "kingwang";
stu.age = 23;
printf("name=%s\n,age=%d\n",stu.name,stu.age);
2.第二种赋值方式
struct Student stu = {"kingwang",23 };
printf("name=%s\n,age=%d\n",stu.name,stu.age);
3.第三种赋值方式
struct Student stu = {.name = "kingwang", .age = 23};
printf("name=%s\n,age=%d\n",stu.name,stu.age);
注意:struct Student stu;
stu = {"kingwang",23};
这种赋值方式是错误的,定义结构体的时候应该同时一次性初始化,或者这样赋值stu.name = "kingwang";stu.age = 23;
补充:结构体变量也可以作为另一个结构体的成员,如果某个成员也是结构体变量,可以连续使用成员运算符”.”访问最低一级成员
struct Date{
int year;
int month;
int day;
};
struct Student {
char *name;
struct Date birthday;
};
struct Student stu;
stu.birthday.year = 1993;
stu.birthday.month = 11;
stu.birthday.day = 2;
结构体数组用法和普通数组用法一样
struct Student {
char *name;
int age;
}stu[2] = {{"kingwang",23},{"wang",22}};
五、结构体内存问题
定义结构体类型,只是说明了该类型的组成情况,并没有给它分配存储空间,就像系统不为int类型本身分配空间一样的道理。只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量。
struct {
char *name;
int age;
};
struct Student stu;
前面四行是没有分配存储空间的,当执行第5行时才分配存储空间给stu变量。
结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列。
六、结构体作为函数参数
将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中的成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参。
示例代码
#include<stdio.h>
//定义一个结构体
struct Student {
int age;
};
void test(struct Student stu){
printf("修改前的形参:%d\n",stu.age);
//修改实参中的age
stu.age = 10;
printf("修改后的形参:%d\n",stu.age);
}
int main(int argc, const char * argv[]){
// insert code here...
struct Student stu = {30};
printf("修改前的实参:%d\n",stu.age);
//调用test函数
test(stu);
printf("修改后的实参:%d\n",stu.age);
return 0;
}
输出结果:
七、指向结构体的指针
每个结构体变量都有自己的存储空间和地址,因此指针也可以指向结构体变量。
结构体指针变量的定义形式:struct 结构体名 *指针变量名
有了指向结构体的指针,那么就有3种访问结构体成员的方式
1.结构体变量名.成员名
2.(*指针变量名).成员名
3.指针变量名->成员名
示例代码
#include <stdio.h>
int main(int argc, const char * argv[]) {
// insert code here...
//定义一个结构体类型
struct Student {
char *name;
int age;
};
//定义一个结构体变量
struct Student stu = {"kingwang",23};
//定义一个指向结构体的指针变量
struct Student *p;
//指向结构体变量stu
p = &stu;
//方式1.结构体变量名.成员名
printf("name=%s,age=%d\n",stu.name,stu.age);
//方式2.(*指针变量名).成员名
printf("name=%s,age=%d\n",(*p).name,(*p).age);
//方式3.指针变量名->成员名
printf("name=%s,age=%d\n",p->name,p->age);
return 0;
}
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-