结构体

包含头文件

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

结构体定义

定义一个结构体 superGirl,用于存储超女的信息。

结构体的属性不能有初始值

struct superGirl {
    char name[50]; // 名字
    int age;       // 年龄
    int height;    // 身高
    char sc[30];   // 身材
    char yz[30];   // 颜值
};

结构体声明与初始化

声明一个结构体变量 girl 并进行初始化。

    struct superGirl girl;

结构体大小

打印结构体类型和变量占用的空间大小。

    printf("结构体类型占用空间的大小:%d\n", sizeof(struct superGirl));
    printf("结构体变量占用空间的大小:%d\n", sizeof(girl));

结构体初始化

使用 memset 函数将结构体变量 girl 的内存全部字节置为0。

    memset(&girl, 0, sizeof(girl));
    memset(&girl, 0, sizeof(struct superGirl));

结构体的使用

使用结构体变量 girl 并赋值。

    strcpy(girl.name, "小红");
    girl.age = 18;
    girl.height = 160;
    strcpy(girl.sc, "火辣");
    strcpy(girl.yz, "漂亮");
    printf("姓名:%s\n", girl.name);
    printf("年龄:%d\n", girl.age);
    printf("身高:%d\n", girl.height);
    printf("身材:%s\n", girl.sc);
    printf("颜值:%s\n", girl.yz);

结构体指针

声明并使用结构体指针 pointer

    struct superGirl *pointer = &girl;
    strcpy((*pointer).name, "YY"); // 赋值
    printf("变量用法:%s\n", (*pointer).name); // 取值
    strcpy(pointer->name, "杨逸"); // 赋值
    printf("箭头用法:%s\n", pointer->name); // 取值

结构体的复制

使用 memcpy 函数复制结构体。

    struct superGirl myGirl;
    memcpy(&myGirl, &girl, sizeof(myGirl));
    printf("拷贝后结构体的姓名:%s\n", myGirl.name);
    printf("拷贝后结构体的年龄:%d\n", myGirl.age);
    printf("拷贝后结构体的身高:%d\n", myGirl.height);
    printf("拷贝后结构体的身材:%s\n", myGirl.sc);
    printf("拷贝后结构体的颜值:%s\n", myGirl.yz);

内存填充与清零

使用 memsetbzero 函数对结构体进行内存填充和清零。

    memset(&girl, 0, sizeof(girl));
    bzero(&myGirl, sizeof(myGirl));

相关函数原型

  • void *memset(void *s, int v, size_t n);:将 s 指向的内存的前 n 个字节设置为 v
  • void *memcpy(void *dest, const void *src, size_t n);:从 src 指向的内存地址的起始位置开始拷贝 n 个字节到 dest 指向的内存地址。
  • void bzero(void *s, size_t n);:将 s 指向的内存的前 n 个字节设置为 0。

完整实例代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//声明结构体不允许有间隙
//#pragma pack(1)
//定义一个结构体,大括号末尾需要分号
struct superGirl{
    char name[50];
    int age;
    int height;
    char sc[30];
    char yz[30];
};

int main(){
    //声明一个结构体
    struct superGirl girl;
    //结构体声明并初始化
    //顺序初始化
    // struct superGirl girl = {"小丽",18,170,"火辣","漂亮"};
    //指定成员变量初始化,变量名可以省略
    // struct superGirl girl = {
    //     .name = "YY",
    //     .age = 18,
    //     .height = 170,
    //     .sc = "火辣",
    //     .yz = "漂亮"
    //     };
    //结构体占用的空间不一定等于所有结构体内类型占用空间之和,可能会大于,结构体内数据在内存是连续的,但是可能是有间隙的
    printf("结构体类型占用空间的大小:%d\n",sizeof(struct superGirl));
    printf("结构体变量占用空间的大小:%d\n",sizeof(girl));
    //结构体初始化,对保存结构体的内存全部字节置为0
    memset(&girl,0,sizeof(girl));
    memset(&girl,0,sizeof(struct superGirl));
    //结构体的使用
    strcpy(girl.name,"小红");
    girl.age = 18;
    girl.height = 160;
    strcpy(girl.sc,"火辣");
    strcpy(girl.yz,"漂亮");
    printf("姓名:%s\n",girl.name);
    printf("年龄:%d\n",girl.age);
    printf("身高:%d\n",girl.height);
    printf("身材:%s\n",girl.sc);
    printf("颜值:%s\n",girl.yz);
    //结构体指针
    struct superGirl *pointer = &girl;
    //结构体指针的使用
    //变量用法
    strcpy((*pointer).name,"YY");//赋值
    printf("变量用法:%s\n",(*pointer).name);//取值
    //箭头用法
    strcpy(pointer->name,"杨逸");//赋值
    printf("箭头用法:%s\n",pointer->name);//取值
    //结构体的复制,方式一:一一对应对每个成员变量进行赋值;方式二:使用内存拷贝函数的方式
    //内存拷贝函数 struct memcpy(struct *target,struct *source,int size);size表示拷贝的字节数
    struct superGirl myGirl;
    memcpy(&myGirl,&girl,sizeof(myGirl));
    //打印拷贝后的结构体
    printf("拷贝后结构体的姓名:%s\n",myGirl.name);
    printf("拷贝后结构体的年龄:%d\n",myGirl.age);
    printf("拷贝后结构体的身高:%d\n",myGirl.height);
    printf("拷贝后结构体的身材:%s\n",myGirl.sc);
    printf("拷贝后结构体的颜值:%s\n",myGirl.yz);
    //内存填充memset(void *s,int v,size_t n),*s地址空间开始,v填充的值,n填充多少byte
    memset(&girl,0,sizeof(girl));
    //内存清零void bzero(void *s,size_t n)
    bzero(&myGirl,sizeof(myGirl));
    return 0;
}