结构体又称自定义数据类型,可表示为
struct +类型名
例如我们需要统计一个学生的姓名、年龄等信息这个时候我们就需要用到结构体:
struct Student
{
char name[20];
int age;
};
//自定义数据类型,定义完成以后,等同于内置类型 这句话如何理解呢我们看下面代码
int main()
{
int a;
int b;
int arr[45];
struct Student stu1;
struct Student brr[5];
struct Student *p1;
return 0;
} 在这里呢,我们引用上边的语句块,struct Student stu1; struct Student brr[5];struct Student *p1;这三句代码作用就相当于是内置类型,这样并不会出现语法错误,我们可以当做内置类型来使用
在看下边代码:
struct A
{
int a;
char b;
short c;
double d;
//struct B f;//error这句代码错误是因为语句从上至下执行struct B并没有定义,不知道给他分配多少字节,所以无法使用未定义的类型
//struct A g;//error,结构体不能定义一个自身的普通成员变量,
int i;
struct A *p;//ok而这句编译后并没有错误是因为,指针就是四个字节,是确定的,所以这句合法
};
还是上边的例子,如果给出在填充学生信息时,年龄漏填,我们需要进行补充,则可以通过“.”来访问它的成员:如
int main()
{
struct Student stu1;
struct Student stu2 = {"liubei",25};
struct Student stu3 = {"caocao"};
stu3.age = 30;
//stu3.name = "sunquan";//error
strcpy(stu3.name,"sunquan");
struct Student *pstu = &stu2;
//int *p = &a;
//(*pstu).age = 35;
pstu->age = 35;
return 0;
}
那么问题来了,要是定义的是一个指针变量我们如何来修改它的值呢?前边介绍过,子函数要想改变父函数的值必须进行传指针解引用
int main()
{
struct Student stu1;
struct Student stu2 = {"liubei",25};
struct Student stu3 = {"caocao"};
stu3.age = 30;
struct Student *pstu = &stu2;
int *p = &a;
(*pstu).age = 35;
return 0;
}
在这里呢我们一般会忽略优先级,一般会写成*pstu.age = 35;这种形式,人都会犯错误,于是开发者用一种新的写法解决这个问题 :pstu->age = 35; 就是用一个指向符号。多方便,(有两个自带*的符号“ -> ”和“[]”)
为了加深理解看下一段代码:
struct B
{
int c;
int *d;
struct A e;
};
int main()
{
struct B aa;
struct B *bb = &aa;
return 0;
}
通过aa,*bb来访问他们的成员,应为
aa.c;
aa.d;
aa.e.a;
aa.e.b;
bb->c;
bb->d;
bb->e.a;
bb->e.b;
总结一下就是:1.结构体定义完成后就等同于内置类型
2.结构体不能定义一个自身的普通成员,但可以定义一个指向自身的指针
3.结构体普通变量可以通过“.”来访问它的成员
4.结构体指针变量通过“->”访问它的成员