2021-07-15 结构体与指针

结构体中成员的操作

一、将一个结构体中的数据拷贝到另一个结构体中
// 需求:有两个结构体变量a b 其中b为空结构体,将a结构体中的数据
        拷贝到b结构体中

// 结构体成员的拷贝
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct stu
{
  int id;
  int age;
  char name[128];
};

void memcpy_str(struct stu *x,struct stu *y)//定义拷贝函数需要传入的参数地址,用指针进行接收
{
memcpy(x,y,sizeof(*x));//内存拷贝函数
}

int main()
{
struct stu a={1,20,"amy"};
struct stu b;
memcpy_str(&b,&a);
printf("%d %d %s",b.id,b.age,b.name);

}

当然这是内核中进行的拷贝操作按照相同数据类型可相互赋值的规则可直接进行b=a;赋值操作

// 结构体成员的拷贝
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct stu
{
  int id;
  int age;
  char name[128];
};

int main()
{
struct stu a={1,20,"amy"};
struct stu b;
b=a;
printf("%d %d %s",b.id,b.age,b.name);

}
二、结构体指针

当我们想使用指针对结构体进行操作时,像使用指针操作其他数据一样我们首先需要先定义一个相同类型的指针,操作结构体当然就是结构体类型指针,但是这里往往会犯一个错误(本人亲身经历)代码如下

// 结构体指针
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct stu
{
int id;
int age;
char name[128];
};

int main()
{
struct stu *p;//定义结构体类型指针
struct stu a;//定义结构体类型变量
p->id=1;//使用指向操作利用地址对结构体成员进行操作
p->age=23//使用指向操作利用地址对结构体成员进行操作
printf("%d %d ",a.id,a.age);//打印操作后的结果

}

以上代码打印结果一定是一串地址或者我们意想不到的错误(3秒钟时间找一下错误)

认真分析后我们会发现其实此时的结构体指针为一个野指针(没有指明指向地址的指针)野指针我们暂时认为是不可操控的,解决方法为给定义一个变量将此变量空间的地址赋给结构体指针代码如下

// 结构体指针
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct stu
{
int id;
int age;
char name[128];
};

int main()
{
struct stu a;//定义一个变量(空间)
struct stu *p = &a;//定义结构体类型指针并让此指针指向a的空间
struct stu a;//定义结构体类型变量
p->id=1;//使用指向操作利用地址对结构体成员进行操作
p->age=23//使用指向操作利用地址对结构体成员进行操作
printf("%d %d ",p->id,p->age);//打印操作后的结果(通过地址进行结构体成员操作需要用指向操作)

}

以上是结构体与指针的基本操作接下来将进一步讨论结构体与指针

三、结构体中含有指针的情况

在编程和阅读他人代码的过程中我们常常会遇到结构体中包含有指针的情况这种情况下往往比较复杂接下来通过一个案例来对结构体中含有指针的情况进行解释说明 代码案例如下

// 需求:通过结构体中的指针给名字赋值

// 结构体中包含指针
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct stu
{
int id;
int age;
char *name;
};

int main()
{
struct stu student;//定义结构体名为学生的结构体变量
struct stu *p;//定义结构体指针变量
struct stu *p=(struct stu * )malloc(sizeof(struct stu));//向堆内存申请一块内存空间
p->id=1;//使用指向操作利用地址对结构体成员进行操作
p->age=23//使用指向操作利用地址对结构体成员进行操作
strcpy(p->name,"amy");//通过字符拷贝函数将字符放进name
printf("%d %d %s ",p->id,p->age,p->name);//打印操作后的结果(通过地址进行结构体成员操作需要用指向操作)

}

经过以上操作就可以将“amy”赋值给结构体中name指针指向的内存
注意:在给结构体中的指针进行赋值时一定要申请空间否则指针为野指针不能进行操作(暂时认为野指针不能操作)

以上就是对结构体中的成员进行操作以及使用指针对其内容进行操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值