C语言 初识结构体

目录

一:什么是结构体

二:结构体 逐个赋值属性

三:结构体的定义

四:结构体内存的占用


一:什么是结构体

不同的数据类型的数据结合在一起形成集合

结构体访问属性 使用点运算符

结构体定义,控制台输出数据,示例如下 

#include<stdio.h>

//描述一个学生 学号 姓名 年龄 密码     
struct student_t{   
     int sno;       //学号   数据成员又名属性,用分号隔开
	 char name[20]; //姓名 
	 char pwd[18];  //密码 
	 int age;       //年龄 
};  //分号很重要,不能少

int main()
{
	//结构体定义
	struct student_t stu={1001,"lily","123456",18};
    //结构体信息访问  用.点运算符  结构体名.属性名
	printf("stu:hello,%d %s %d\n",stu.sno,stu.name,stu.age);//stu:hello,1001 lily 18
	return 0;
}

只定义不初始化,结构体.属性都是随机值,不提倡这种定义方式:

struct student_t stu1; 

二:结构体 逐个赋值属性

结构体定义后,属性 一个一个地进行赋值,[属性赋值]    示例如下:

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

//描述一个学生 学号 姓名 年龄 密码     
struct student_t{   
     int sno;       //学号  
	 char name[20]; //姓名 
	 char pwd[18];  //密码 
	 int age;       //年龄 
}; 

int main()
{
	//结构体定义
    struct student_t stu1;  //只定义没有初始化
	stu1.sno=1002;          //没有初始化只能一个一个赋值
	strcpy(stu1.name,"kity");//字符数组赋值,strcpy引用头文件
	stu1.age=20;
 	printf("stu1:hello,%d %s %d\n",stu1.sno,stu1.name,stu1.age);//stu1:hello,1002 kity 20
	return 0;
}

三:结构体的定义

结构体定义大致分为三种:

定义并全部初始化,

只定义不初始化,

定义部分初始化

定义部分初始化,示例如下,没有赋值到的属性 默认是0或者是空字符串

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

//描述一个学生 学号 姓名 年龄 密码    
struct student_t{   
     int sno;       //学号   
	 char name[20]; //姓名 
	 char pwd[18];  //密码 
	 int age;       //年龄 
};  

int main()
{
	//结构体定义
	struct student_t stu2={1003};  //部分初始化 其他位置自动补零  字符串是空字符串
    printf("stu2:hello,%d %s %d\n",stu2.sno,stu2.name,stu2.age);//stu2:hello,1003 (空字符串) 0
	return 0;
}

结构体属性间存储的地址是连续的

四:结构体内存的占用

使用 sizeof()函数 用来计算字节长度

1.计算内存,以最大的存储类型【内存对齐】

示例一如下: 

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

struct student_t{   
     int sno;       //学号  4
	 char name[20]; //姓名  4*5
	 char pwd[18];  //密码 补充2个 4*5
	 int age;       //年龄 4           共4+20+20+4=48
};  

//计算内存 以最大的存储类型内存对齐

int main()
{
	struct student_t stu={1001,"lily","123456",18};
    printf("stu size=%d\n",sizeof(stu));//stu size=48
	return 0;
}

示例二如下: 

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

struct student_t{   
  int num1;  //4
  char ch;   //1补3 为4
  int num2;  //4        总4+4+4=12
};  
//计算内存 以最大的存储类型内存对齐

int main()
{
	struct student_t stu={4,"lily",18};
    printf("stu size=%d\n",sizeof(stu));//stu size=12
	return 0;
}

2.相邻的同类型的可以合并,数据类型越小的一起往前面放可以节省空间

如下示例 数据类型小的 char数据类型 统一放置于前面 ,可以有效节省内存

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

struct student_t{   
	char num1;     //1
	char num2;     //1  1 1合并为2 补6为8 最后是8
	double num3;   //8                   总8+8=16
};  
//相邻的同类型的可以合并的 数据类型越小的一起前面放可以节省空间

int main()
{
	struct student_t stu={"kity","lily",18.123};
    printf("stu size=%d\n",sizeof(stu));//stu size=16
	return 0;
}

同样的数据类型,没有把较小的数据类型统一放置在前面,相对来说更浪费内存空间 

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

struct student_t{   
  char num1;    // 1 补7 为8
  double num2;  // 8
  char num3;    // 1 补7 为8    总8+8+8=24	
};  
//相邻的同类型的可以合并的 数据类型越小的一起前面放可以节省空间

int main()
{
	struct student_t stu={"kity",18.123,"lily"};
    printf("stu size=%d\n",sizeof(stu));//stu size=24
	return 0;
}

3.结构体内存的计算练习

练习一: 

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

struct student_t{   
  int NO[4];     // 4 向4看齐  4*4=16
  char Name[20]; // 1 向4看齐  4*5=20   总16+20=36
}; 

int main()
{
	struct student_t stu={18,"kity"};
    printf("stu size=%d\n",sizeof(stu));//stu size=36
	return 0;
}

练习二: 

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

struct student_t{   
  int NO[4];     // 4 向8看齐  4*4=》16=》8*2    16
  double str[4]; // 8 向8看齐  8*4=》     8*4    32   总16+32=48	
};  

int main()
{
	struct student_t stu={18,18.123};
    printf("stu size=%d\n",sizeof(stu));//stu size=48
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chenruhan_QAQ_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值