结构体变量的定义:在C语言中可以用结构体来定义不同的数据类型。简单来说,结构体就是用户自定义数据类型的集合体。例如,定义一个学生的结构体。
struct student
{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};
在理论上说,结构体内的各个成员的内存是连续的。但是由于结构体的内存对齐,在编译器的具体实现中每个成员之间可能存在缝隙。所以实际上student结构体在内存中的存储是:4+4+4+1+4=20个字节。如下图:
name | num | age | group | score |
其中编译器为了内存对齐在group和score之间补全了三个字节。
结构体的初始化:
//方法1
struct student stud = {"ming",123,11,'A',66};
//方法2
stud = {
.name = "ming",
.num = 123,
.age = 11,
.group = 'A',
.score = 66};
//给指定的变量赋值
stud.name = "ming";
stud.age = 11;
结构体和数组:
结构体和普通的变量使用是一样的,但是结构体的名字表示的结构体变量本身,而数组名在表示的是数组首个元素的地址(某些情况除外,如sizeof)。
#include <stdio.h>
struct stu
{
int number;
char *name;
};//结构体定义
typedef struct stu stu_t;//给结构体取别名
void stuinfo(stu_t *stu)
{
printf("student number is:%d\n",stu->number);
printf("student name is:%s\n",stu->name);
}
void func(int *arr)
{
for(int i=0;i<10;i++)
printf("%d\t",*arr++);
}
int mian()
{
stu_t stus={1,"hh"};
stuinfo(&stus);//传入的是结构体的地址
int arr[10]={0};//数组的定义初始化
func(arr);//arr=&arr[0],表示arr首元素的地址,不需要&
}
输出结果:
student number is:1
student name is:hh
0 0 0 0 0 0 0 0 0 0