C语言结构体
- Fang XS.
- 1452512966@qq.com
- 如果有错误,希望被指出,学习技术的路难免会磕磕绊绊,不定期更新
结构体
- 在C中,结构体是用户自定义数据类型,允许用户存储不同数据类型。
- 在C中,结构体内可存放基本数据类型,复合数据类型,指针。
- 在C中,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
- 在C中,所有相同/不同类型的数据都可以用结构体封装起来。
- 在C++中,结构体可以包含函数,C不能,但是可以用函数指针。
- 语法
- 第一种方式: struct struct_name{ int struct_member; };。
- typedef方式: typedef struct _struct_name{ int struct_member; }struct_name;
- 定义变量
- 第一种方式:
- struct struct_name{ int struct_member; }struct_var; 直接在分号前定义结构体变量。
- struct struct_name struct_var;
- typedef方式:struct_name struct_var;
- 使用
typedef struct _struct_name{
int struct_member;
}struct_name;
int main(void)
{
struct_name * pStructure = (struct_name *)malloc(sizeof(struct_name));
pStructure->struct_member = 3;
printf("struct_member: %dn", pStructure->struct_member);
free( pStructure ); //释放内存
pStructure = NULL; //指针置空
struct_name Structure = { 5 }; // 直接初始化
printf("struct_member: %dn", Structure.struct_member);
return 0;
}
struct{
int member;
}anonymous_struct;
typedef struct _struct_name{
int struct_member;
struct {
int struct_nesting_member;
};
}struct_name;
int main(void)
{
anonymous_struct.member = 8 ; //直接使用
printf("struct_member: %dn", anonymous_struct.member);
struct_name Structure = { 5 ,3 };
printf("struct_member: %dn", Structure.struct_member);
printf("struct_nesting_member: %dn", Structure.struct_nesting_member);
return 0;
}
typedef struct _struct_name{
int struct_member1;
int struct_member2;
}struct_name;
void print_struct_1(struct_name s){ //值传递
printf("struct_member1: %dn", s.struct_member1);
printf("struct_member2: %dn", s.struct_member2);
}
void print_struct_2(struct_name *s){ //指针传递
printf("struct_member1: %dn", s->struct_member1);
printf("struct_member2: %dn", s->struct_member2);
}
int main(void)
{
struct_name Structure = { 5 ,3 };
print_struct_1( Structure );
print_struct_2( &Structure );
return 0;
}
struct sTest1{
char member1; // 1
int member2; // 4
short member3; // 2
};
struct sTest2{
char member1; // 1
short member2; // 2
int member3; // 4
};
struct sTest3{
char member1; // 1
char member2[2]; // 2
char member3[4]; // 4
};
int main(void)
{
// 基本数据类型大小
printf("sizeof char = %dn", sizeof(char)); // 1 字节
printf("sizeof short = %dn", sizeof(short)); // 2 字节
printf("sizeof int = %dn", sizeof(int)); // 4 字节
printf("sizeof struct1 = %dn", sizeof(struct sTest1)); // 12
printf("sizeof struct2 = %dn", sizeof(struct sTest2)); // 8
printf("sizeof struct3 = %dn", sizeof(struct sTest3)); // 7
return 0;
}
struct sTest1{
char member1 : 2; //member1 是char类型的占2位。
char member2 : 1; //member2 是char类型的占1位。
char member3 : 3;
char : 1; //无名位域用来占位,表示不存放数据,考虑内存对齐需要用到。
char member5 : 1;
};
int main(void)
{
printf("sizeof struct1 = %dn", sizeof(struct sTest1)); // 1字节
return 0;
}
- 结构体在C中广泛大量使用,用途广泛。
- 结构体内部成员变量是函数指针,通过修改函数指针指向的函数,可以实现C语言运行时的‘多态’。
- 使用结构体跟函数指针可以实现简单的类,可以用C来面向对象编程,比如Linux。