06-8 结构体的拷贝赋值问题

1、每次使用结构体的时候都要struct _Person ,比如struct _Person p1={0};sizeof(struct _Person ); 太麻烦。

2、typedef int zhengshu;可以给int取一个别名zhengshu。

因此也可以用typedef struct _Person Person;把Person定义为struct _Person 的别名

3、当然最常用的简化写法:

typedef struct _Person

{

int age;

char* name;

} Person;

4、结构体的赋值

	Person p1={0};
	p1.name = "全智贤";
	p1.age=30;
	Person p2 = p1;
	printf("%d,%d\n",&p1,&p2);
	printf("%s的年龄是%d\n",p1.name,p1.age);

p1和p2的地址不一样,结构体赋值是“复制一份”

5、为了避免内存占用,一般只用一份,因此通过结构体指针传递:

Person *p2 = &p1;

printf("%s的年龄是%d\n",p2->name,p2->age);

6、注意:对于结构体指针,取成员要使用->,而不是“.”

本节代码:

20ptrStructHowToCopy.c

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

/****************************************************************/
/*                                                              */
/*  本程序主要介绍结构体的别名和结构体的不同拷贝赋值方法及区别  */
/*                                                              */
/****************************************************************/

/*
//普通定义结构体的方法1
struct _Person
{
	char *name;    //指针,就是int大小 4个字节,保存的是指向字符串的指针
	int age;       //int大小 4个字节
	double height; //double大小 8个字节
};
*/

//typedef struct _Person Person;

//定义的时候就为其取好别名,方法2
typedef struct _Person
{
	char *name;    //指针,就是int大小 4个字节,保存的是指向字符串的指针
	int age;       //int大小 4个字节
	double height; //double大小 8个字节
} Person;
int main(int argc, char *argv[])
{
	struct _Person p1 = {0};//这样定义的话,里面的内容会是乱七八糟的数据
	
	p1.name = "全智贤";
	p1.age = 30;
	p1.height = 170;
	
	printf("%s,%d岁\n",p1.name,p1.age);
	printf("%d\n",sizeof(struct _Person));

	/*
	Person p2 = {0};
	p2.name = "如鹏网";
	p2.age = 6;
	p2.height = 1190;
	*/
	
	Person p2 = p1;
	p1.age = 300;	
	printf("%s,%d岁\n",p2.name,p2.age);
	printf("%d\n",sizeof(Person));
	printf("%d,%d :p1与p2内存地址不同\n",&p1,&p2);   //两者地址不同,创建一个p2,完全复制p1的内容
	                                                  //修改p1的内容,不影响p2的值,即是做的数据的复制
	
	Person* p3 = &p1;               
	p1.age = 305;
	printf("%d,%d :p1与p3内存地址相同\n",&p1,p3);    //两者地址相同,创建一个p3位指针类型,将p1的地址给了p3
	                                                  //修改p1的内容,p3的值也即随之改变
	printf("%s,%d岁\n",p3->name,p3->age);             //指针的引用需要更改为'->'符号

	return 0;
}
---------- 运行 ----------
全智贤,30岁
16
全智贤,30岁
16
2686712,2686696 :p1与p2内存地址不同
2686712,2686712 :p1与p3内存地址相同
全智贤,305岁


输出完成 (耗时 0 秒) - 正常终止


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值