结构体
包含头文件
#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);
内存填充与清零
使用 memset
和 bzero
函数对结构体进行内存填充和清零。
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;
}