C语言结构体

C语言结构体

  • Fang XS.
  • 1452512966@qq.com
  • 如果有错误,希望被指出,学习技术的路难免会磕磕绊绊,不定期更新

结构体

  • 在C中,结构体是用户自定义数据类型,允许用户存储不同数据类型。
  • 在C中,结构体内可存放基本数据类型,复合数据类型,指针。
  • 在C中,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
  • 在C中,所有相同/不同类型的数据都可以用结构体封装起来。
  • 在C++中,结构体可以包含函数,C不能,但是可以用函数指针。
  1. 语法
    • 第一种方式: struct struct_name{ int struct_member; };
    • typedef方式: typedef struct _struct_name{ int struct_member; }struct_name;
  2. 定义变量
    • 第一种方式:
      • struct struct_name{ int struct_member; }struct_var; 直接在分号前定义结构体变量。
      • struct struct_name struct_var;
    • typedef方式:struct_name struct_var;
  3. 使用
/*使用typedef定义结构体*/
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: %d\n", pStructure->struct_member);
    free( pStructure );	//释放内存
    pStructure = NULL;  //指针置空
    
    struct_name  Structure = { 5 };	// 直接初始化
    printf("struct_member: %d\n", Structure.struct_member);
    return 0;
}
  • 匿名结构体:
/* 使用方式:*/
struct{
    int member;
}anonymous_struct;/*直接定义了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: %d\n", anonymous_struct.member);

	struct_name  Structure = { 5 ,3 };
    printf("struct_member: %d\n", Structure.struct_member);
    printf("struct_nesting_member: %d\n", 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: %d\n", s.struct_member1);
    printf("struct_member2: %d\n", s.struct_member2);
}

void print_struct_2(struct_name *s){ //指针传递
    printf("struct_member1: %d\n", s->struct_member1);
    printf("struct_member2: %d\n", s->struct_member2);
}
/**
 *  值传递与指针传递的区别在于:
 *  当结构体较大时,值传递是在进行数据的拷贝,效率低且占内存。
 * 	这个时候使用结构体指针就快很多了,访问结构的数据就是通过指针间接访问。
 * 	无论结构体多大,传递的只是一个4字节的指针。
 */
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  = %d\n", sizeof(char));    // 1 字节
    printf("sizeof short = %d\n", sizeof(short));   // 2 字节
    printf("sizeof int   = %d\n", sizeof(int));     // 4 字节

    printf("sizeof struct1 = %d\n", sizeof(struct sTest1)); // 12
    printf("sizeof struct2 = %d\n", sizeof(struct sTest2)); // 8
    printf("sizeof struct3 = %d\n", 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;
};
/**
 * 结构成员加:接数字,代表这个成员变量占用的位数。
 * 比如 member2 在内存中只占1位,是char类型数据范围[0,1]。只能是0或者1。
 * C语言标准规定,位域的宽度不能超过它所依附的数据类型的长度。
 * 就是成员变量的类型限制最大范围,使用位域能限制成员变量的具体范围,合理使用节省内存。
 */
int main(void)
{
    printf("sizeof struct1 = %d\n", sizeof(struct sTest1)); // 1字节
    return 0;
}
  • 结构体在C中广泛大量使用,用途广泛。
  • 结构体内部成员变量是函数指针,通过修改函数指针指向的函数,可以实现C语言运行时的‘多态’。
  • 使用结构体跟函数指针可以实现简单的类,可以用C来面向对象编程,比如Linux。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值