含有指针类型成员变量的结构体使用事项

本文详细介绍了C++中结构体含有指针成员时需要注意的四个关键点:结构体初始化时必须为指针分配内存,作为函数参数时若要保留变量变化需传递引用,作为函数返回值时可以直接返回,以及如何使用结构体指针进行成员访问。通过实例展示了正确操作指针成员的方法,强调了使用'->'运算符的必要性。
摘要由CSDN通过智能技术生成

含有指针类型成员变量的结构体在实际代码中也是经常遇到的,这篇文章总结了几个注意点,原文链接:https://blog.csdn.net/u012273127/article/details/52388220

在C++中经常用到结构体和指针,当定义一个结构体,结构体成员中有指针的时候,需要注意很多。一下分为:结构体初始化、结构体作为函数参数、函数返回值、以及结构体指针的情况进行总结。

一、含有指针成员的结构体初始化

含有指针成员的结构体初始化的时候,必须给指针成员给一个明确的地址。注意:给指针成员初始化的时候,要么给其一个地址,比如是数组数组地址的时候,就可以通过指针来操作数组,也可以一个变量的地址;还可以给其新建一段内存,就是new一段内存,内存的地址由系统决定。如果含有指针的结构体在初始化之前直接对指针进行操作,会出现错误,因为指针必须先初始化再操作。

以下是示例:

struct keypoint
{
    int x;
    int y;
    int* data;
    int number;
};
 
keypoint point;
point.x = 1;
point.y = 0;
point.number = NUMBER;
for (int i = 0; i < NUMBER; i++)
{
    point.data[i] = i;  //会出错,因为为初始化指针,就直接使用
}

必须为其指针初始化赋值:

point.data = new int [NUMBER];

二、含有指针成员的结构体作为函数参数

当含有指针成员的结构体作为函数参数的时候,通过形参将结构体传入函数,结构体变量中的指针指向的变量变化可以保存,但是一般变量的变化不能保存。如果要保存一般变量的变化,需将函数参数写成引用的类型&。

在上述的代码基础上:


keypoint point0;
point0.x = 10;
point0.y = 10;
point0.number = 100;
point0.data = new int[point0.number];
for (int j = 0; j < 100; j++)
    point0.data[j] = j;
changeKeypoint(point0);<span style="white-space:pre">        </span>//运行结果data指向的数据每个数据都改变了,但是x和y的值没有变化。
 
<pre name="code" class="cpp">//函数定义
void changeKeypoint(keypoint keypoints)
{
    keypoints.x += 1000;
    keypoints.y += 1000;
    
    for (int i = 0; i < keypoints.number; i++)
    {
        keypoints.data[i] += 1000;
    }
}

但是如果将函数改为:

void changeKeypoint(keypoint &keypoints)<span style="white-space:pre">    </span>//函数参数为引用类型
{
    keypoints.x += 1000;
    keypoints.y += 1000;
    
    for (int i = 0; i < keypoints.number; i++)
    {
        keypoints.data[i] += 1000;
    }
}

这样就可以实现对结构体变量的x和y值的改变。


三、含有指针成员的结构体作为函数返回值

可以直接将结构体和一般类型的变量(比如int、double等)返回。

keypoint point0 = SetPoint();<span style="white-space:pre">        </span>//points结构体的x、y和指针的数据值都能返回
 
//函数定义
keypoint SetPoint()
{
    keypoint point0;
    point0.x = 10;
    point0.y = 10;
    point0.number = 100;
    point0.data = new int[point0.number];
    for (int j = 0; j < 100; j++)
        point0.data[j] = j;
    return point0;
}
运行结果:
point0.x = 10, <pre name="code" class="cpp">point0.y = 10,
<pre name="code" class="cpp">point0.data[j] = j;  //j从0到100

四、含有指针成员的结构体的指针

可以定义指向结构体的指针,即指针指向的是一个结构体,指针存放的是一结构体的指针。

keypoint* points;
points->x = 0;
points->y = 10;
points->data = new int [100];

这个时候需要注意的是,对结构体成员的操作,必须用“->”运算符,不能用"."号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值