基本定义:结构体指的是一种数据结构,是聚合数据类型的一类,通俗讲就像是打包封装,把一些变量有共同特征(比如同属于某一类事物的属性)的变量封装在内部,通过一定方法访问修改内部变量。
一、结构体的定义:
1.简单的结构体定义
struct Student{
char name[20];
int age;
int number;
};
2.附加变量初始化的结构体定义(为结构体定义一个别名)
struct Student{
char name[20];
int age;
int number;
}Stu;
这就跟下面这个是等效的:
struct Student{
char name[20];
int age;
int number;
};
struct Student Stu;
3.如果结构体只需要定义一个变量Stu,不需要再去定义第二个变量,那么可以简写:
struct {
char name[20];
int age;
int number;
}Stu;
注意:结构体内部的成员可以是任意类型的,但是不能嵌套自己!!比如说:
struct Student{
char name[20];
struct Student stu;//错误!不能嵌套自己!
};
1.结构体的声明:
struct Student student;
2.结构体的成员变量的定义可以随声明进行:
struct Student student = {"zhangsan",15,0001};
3.结构体之间可以互相赋值:
struct Student stu = student;
4.单独为结构体的成员变量赋值:
stu.name[0]='z';
stu.name[1]='h';
.....
stu.age=15;
stu.number=001;
三、访问元素:
结构体中访问成员是通过变量名.成员名,如下所示
// 定义结构体类型
struct Student{
int age;
int number;
};
// 定义结构体类型
struct Student stu = {15,0001};
// 获取stu这个变量的age值
int num2 = stu.age;
四、结构体指针:
1.结构体指针,定义结构体指针跟定义结构体变量一样,首先必须定义结构体类型,如下所示:
// 定义结构体类型
struct Student{
int age;
int number;
};
// 定义结构体变量
struct Student stu = {15,0001};
// 定义结构体指针
struct Student *p = &stu;
2.同样的定义了结构体指针,访问结构体变量的成员又多了几种方法,如下所示:
/ 定义结构体类型
struct Student{
int age;
int number;
};
// 定义结构体变量
struct Student stu = {15,0001};
// 定义结构体指针
struct Student *p = &stu;
// 访问结构体变量的成员可以用stu.age,p->age,(*p).age
printf("%d==%d==%d\n", stu.age, p->age, (*p).age);
struct结构体,在结构体定义的时候不能申请内存空间,不过如果是结构体变量,声明的时候就可以分配。
结构体的大小是结构体所含变量大小的总和,并且不能用"char a[]"这种弹性(flexible)变量,必须明确大小,下面打印输出上述结构体的size:
printf("size of struct Stu:%d\n",sizeof(struct Stu));
printf("size:%d\n",sizeof(student));
结果都是28:分别是char数组20,int变量4*2.
和C++的类不一样,结构体不可以给结构体内部变量初始化,。
如下,为错误示范:
#include<stdio.h>
//直接带变量名student
struct Student{
// char name[20] = "zhangsan";
// int age = 15;
// int number = 0001;
}student;
PS:结构体的声明也要注意位置的,作用域不一样。