C语言结构体

一、结构体的概念

        在C语言中,使用结构体(struct)来存放一组不同类型的数据。当需要定义大量不同类型的变量时,对这些变量一一初始化太过麻烦,此时可以采用结构体。

        结构体格式如下:

struct 结构体名称
{
  结构体成员1的声明;
  结构体成员2的声明;
  结构体成员3的声明;
       ...
  结构体成员n的声明;
};

        结构体是不同类型数据构成的一个集合,是程序员自定义的一种数据类型。结构体成员可以是任何类型的变量。

struct student
{
  char name[21];    /*姓名*/
  int  age;    /*年龄*/
  int  height;    /*身高*/
  
};

二、结构体变量

        结构体也是一种数据类型,是程序员自定义的,也可以用来定义变量。

例如

 struct student tang,zhou

        就定义了tang和zhou两个结构体变量。

三、结构体占用内存情况

        为了对齐内存空间,结构体各个成员之间可能存在缝隙,使用sizeof求结构体占用的空间大小时会把缝隙一同计算进去。

#include<stdio.h>

struct student
{
  char name[50];
  int age;
  int height;
  char mother[30];
  char father[30];
};
  
  int main()
{
  struct student tang;
  printf("%d\n",sizeof(struct student));    /*输出结果为120*/
  printf("%d\n",sizeof(tang));    /*输出结果为120*/
}
  

        两个整型所占空间为8,50+8+30+30=118,结果却是120,这是因为结构体成员间存在间隙。消除间隙只需要加一个#pragma pack(1)

#include<stdio.h>

#pragma pack(1)
struct student
{
  char name[50];
  int age;
  int height;
  char mother[30];
  char father[30];
};
  
  int main()
{
  struct student tang;
  printf("%d\n",sizeof(struct student));    /*输出结果为118*/
  printf("%d\n",sizeof(tang));    /*输出结果为118*/
}

四、结构体的初始化

        采用memset来初始化结构体,下面两种写法都行。

memset(&tang,0,sizeof(tang));

memset(&tang,0,sizeof(struct student));

五、结构体数组

        结构体可以被定义为数组变量,本质上与其他类型的数组变量没有区别

struct student ifm[5];
memset(ifm,0,sizeof(ifm));
strcpy(ifm[0].name,"小明");
ifm[0].age = 12;
strcpy(ifm[1].name,"小红");
ifm[1].age = 11;
     ...

六、结构体指针

        结构体变量是内存变量,有内存就有地址,也就有结构体指针。

struct student tang;
struct student *p = &tang;

        可以通过结构体指针来定义结构体成员,比如

(*p).name;

在这个表达式中 . 的优先级高于 * ,所以得加一个括号,如果去掉()就等效于*(p.name)。

还可以用

p->name;

来表示,->是一种新的运算符,可以通过它使结构体指针直接使用结构体成员。为了更直观一般选用这种写法。

七、结构体的复制

         基本数据类型(int、double、char)可以用 = 直接赋值。如果不是基本数据类型而是字符串,赋值可以采用strcpy函数。如果要把结构体变量的值赋给另一个结构体变量有两种方法:

1、结构体成员逐一赋值

2、采用memcpy函数进行内存拷贝,strcpy只能拷贝字符串,memcpy可以拷贝所有的类型。

void *memcpy(void *dest,const void *src,size_t n)

参数说明:

src:源内存变量的起始地址

dest:目的内存变量的起始地址

n:需要复制内容的字节数

函数返回指向dest

栗子:

#include<stdio.h>
#include<string.h>

struct student
{
  char name[50];
  int age;
  int height;
  char mother[30];
  char father[30];
};
  

  int main()
  {
    struct student tang,zhou;
    strcpy(&zhou,"mengchen");
    memcpy(&tang,&zhou,sizeof(struct student));
    printf("%s\n",zhou.name);    /*输出结果为mengchen*/
    printf("%s\n",tang.name);    /*输出结果为mengchen*/
  }
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白小白—

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值