结构体_2

下面先举一个例子

例1:

# include <stdio.h>

struct Student
{
	int age;
	char sex;
	char name[100];
}; //分号不能省

int main(void)
{
	struct Student st = {20, 'M', "张三"};
	struct Student * pst = &st;
	
	printf("%d %c %s\n", st.age, st.sex, st.name);
	printf("%d %c %s\n", pst->age, pst->sex, pst->name);  //pst->age 转化成 (*pst).age 等价于 st.age

	return 0;
}

输出结果为:

在上个博客中,没有说到结构体中的字符串,这次说明一下,字符串需要用一个字符数组表示,而给它赋予字符串,如果不用上面的那样情况(即定义结构体变量的同时被赋予内容),就需要用到一个函数,下面会举例说一下


例2:

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

struct Student
{
	int age;
	char sex;
	char name[100];
}; //分号不能省

void InputStudent(struct Student *);
void OutputStudent(struct Student ss);
int main(void)
{
	struct Student st;  //15行

	InputStudent(&st); //17行
	OutputStudent(st); //18行

	return 0;
}

void OutputStudent(struct Student ss)  //23行
{
	printf("%d %c %s\n", ss.age, ss.sex, ss.name);
}

void InputStudent(struct Student * pstu) //pstu只占4个字节
{
	(*pstu).age = 10;
	strcpy(pstu->name, "张三");  //31行
	pstu->sex = 'M';	
}

/*
void InputStudent(struct Student stu)  //36行
{
	stu.age = 10;
	strcpy(stu.name, "张三");  //不能写成 stu.name = "张三";  //39行
	stu.sex = 'M';
}
*/
输出结果为:

17行是对结构体变量输入,必须发送st的地址,18行对结构体变量输出 ,可以发送st的地址,也可以直接发送st的内容(但是推荐使用发送地址的方式,原因下面会说明)

而从37行开始的函数不能修改15行st的值,所以说这个函数是错误的,原因不说了,这个在关于指针里边说过。

31行和39行,在对字符数组进行赋予内容时,使用了strcpy函数,这个函数的意思是string copy,即给字符数组赋予字符串,当然,使用这个函数时必须在程序的上方加上 # include <string.h>


下面说一下为什么推荐使用发送地址的方式传递内容

指针的优点之一:

快速的传递数据,

耗用内存小

执行速度快


对结构体变量输出,可以发送st的地址,也可以直接发送st的内容 但为了减少内存的耗费,也为了提高执行速度,推荐发送地址


所以,例2的18行、23行代码最好像例3的19行、24行这样写

例3:

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

struct Student //4行
{
	int age;
	char sex;
	char name[100];
}; //分号不能省  9行
 
void InputStudent(struct Student *);
void OutputStudent(struct Student *);
int main(void)
{
	struct Student st ;  //15行
	//printf("%d\n", sizeof(st));  //16行 

	InputStudent(&st); //对结构体变量输入  必须发送st的地址
	OutputStudent(&st); //19行 

	return 0;
}

void OutputStudent(struct Student *pst)  //24行
{
	printf("%d %c %s\n", pst->age, pst->sex, pst->name);
}

void InputStudent(struct Student * pstu) //pstu只占4个字节
{
	(*pstu).age = 10;
	strcpy(pstu->name, "张三");
	pstu->sex = 'M';	
}

输出结果为:

而且,对于本程序的19行,使用指针变量传送地址,,而指针变量只占4个字节,如果是传送内容,我们看4行到9行的结构体类型占的内存大小,一个int型数据占4个字节(在这里,之所以说在这里,是因为int不一定在任何地方都是占4个字节,当然,大多数情况下都是占4个字节),一个char行数据占一个字节,100个char行数据的数组占100个字节,总共105个字节(实际上一般也不会只占105个字节,因为计算机存储数据时,有机器对齐填充数字的情况,这需要计算机组成原理的知识,这里不多做说明),我们可以把上面代码的第16行前面的注释去掉,这时输出的结果为:


结果是占108个字节


结构体变量的运算

结构体变量不能相加,不能相减,也不能互相乘除

但结构体变量可以相互赋值


例子:

struct Student
{
	int age;
	char sex;
	char name[100];
};//分号不能省
struct Student st1, st2;
st1+st2  st1*st2  st1/st2 都是错误的
st1 = st2  或者 st2 = st1 都是正确的

【所有代码均在windows系统下VC++6.0下运行通过】

(如有错误,敬请指正)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值