C语言入门21 结构体

一、结构体三种定义方式和使用

  1. 方式一,常规定义方式
#include<stdio.h>
struct Stu
{
	int age;
	char name[20];
};
int main()
{
	struct Stu a, b, c;
	a.age = 10;
}
  1. 方式二,这种方式可以在定义结构体后顺便定义几个该结构体的变量,之后仍然可以定义。
#include<stdio.h>
struct Stu
{
	int age;
	char name[20];
}stu1,stu2;
int main()
{
	struct Stu stu3;
	stu3.age = 12;
	stu1.age = 10;
}
  1. 方式三,这种方式不写结构体名称,只能使用顺便定义的结构体变量,后续无法继续定义其他变量。
#include<stdio.h>
struct
{
	int age;
	char name[20];
}stu1,stu2;
int main()
{
	stu1.age = 10;
}

二、给结构体起类型名

这一步主要是简化了定义类型名时struct 类型名 变量名;这一步骤的繁琐。

#include<stdio.h>
typedef struct stu
{
	int age;
	char name[20];
}Stu;
int main()
{
	Stu s;
	s.age = 10;
}

这样就可以直接用Stu来替代struct stu了。

三、结构体变量的三种赋值方式

  1. 在定义变量时赋值,可以不给所有成员都赋值,但是必须从上往下赋值,不能出现中间隔着一个成员不赋值的情况
#include<stdio.h>
typedef struct stu
{
	int age;
	char name[20];
}Stu;
int main()
{
	Stu s = {
		18,
		"张三"
	};

	printf("age = %d  name = %s", s.age, s.name);
}
  1. 定义变量后再一个个赋值
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
typedef struct stu
{
	int age;
	char name[20];
}Stu;
int main()
{
	Stu s;
	s.age = 18;
	strcpy(s.name, "zhangsan");//数组名不能直接赋值
	printf("age = %d  name = %s", s.age, s.name);
}
  1. 用一个结构体变量给另一个结构体变量赋值。前提是一定要是同一个结构体。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
typedef struct stu
{
	int age;
	char name[20];
	double score;
}Stu;
int main()
{
	Stu s1 = {
		10,
		"zhangsan",
		98.5
	};
	Stu s2 = s1;
	printf("%d\n", s2.age);
}

四、结构体数组

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
typedef struct stu
{
	int age;
	char name[20];
	double score;
}Stu;
int main()
{
	Stu s[3] = {
		{18,"zhangsan",99},
		{18,"lisi",97},
		{18,"wangwu",95}
	};

	printf("%s\n", s[0].name);//zhangsan
	printf("%s\n", s[1].name);//lisi
	printf("%s\n", s[2].name);//wangwu

	return 0;
}

五、结构体指针

  1. 结构体指针的定义以及对成员的访问
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
typedef struct stu
{
	int age;
	char name[20];
	double score;
}Stu;
int main()
{
	Stu s = {
		18,
		"zhangsan",
		98.5
	};
	Stu* p = &s;
	printf("name = %s\n", (*p).name);//方式一
	printf("name = %s\n", p->name);//方式二
	return 0;
}
  1. 结构体指针指向的地址就是结构体第一个成员变量的地址。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
typedef struct stu
{
	int age;
	char name[20];
	double score;
}Stu;
int main()
{
	Stu s = {
		18,
		"zhangsan",
		98.5
	};
	Stu* p = &s;
	printf("&age = %p\n", &s.age);//00BBFB2C
	printf("p= %p\n", p);//00BBFB2C
	return 0;
}

验证完成,结论正确。

六、结构体开辟内存规则

给结构体变量分配内存的时候,会去结构体变量中找基本类型的成员,哪个基本类型的成员占字节数多,就以它大小为单位开辟内存:

  1. 成员中只有char类型,以1字节为单位开辟内存。
  2. 成员中出现short int,且没有更大字节数的基本类型,以2字节为单位开辟内存。
  3. 出现int,float,指针,没有更大字节数的基本类型,以4字节为单位开辟内存。
  4. 出现double类型的数据,分情况:
    4.1 在vc6.0和vs中,以8字节为单位开辟内存。
    4.2 在Linux环境的gcc下,以4字节为单位开辟内存。

使用 #progma pack(2)可以手动指定对齐值value

  1. value只能是:1,2,4,8等二的次方
  2. 指定对齐值与结构体成员数据类型对齐值相比取较小值。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值