函数体对结构体赋值的几种方法

例有结构体

struct POINT {
	int a;
	int b;
}

*如何通过函数对其进行赋值 *

通过形参赋值,可以有两种方式,一种是使用一级指针,一种是使用二级指针。

  1. 使用一级指针进行赋值时,在原调用体内声明一个此结构体类型的变量,再用取地址获得变量的指针传达赋值函数内进行赋值。例子如下:
#include 
using namespace std;
struct POINT {
    int a;
    int b;
};
void AssignPoint(POINT* p_pstPoint) {
    p_pstPoint->a = 1;
    p_pstPoint->b = 2;
}
int main() {
    POINT stPoint;
    AssignPoint(&stPoint);
    cout << stPoint.a << " " << stPoint.b << endl;
    return 0;
}
  1. 使用二级指针时,则需要在调用体或者赋值体内对二级指针指向一级指针的内存进行申请。例子如下。第16行注释或不注释都行
    此种方法需要自己维护内存
#include 
using namespace std;
struct POINT {
    int a;
    int b;
};
void AssignPoint(POINT** p_ppstPoint) {
    if((*p_ppstPoint) == nullptr) {
        (*p_ppstPoint) = (POINT*)malloc(sizeof(POINT));
    }
    (*p_ppstPoint)->a = 1;
    (*p_ppstPoint)->b = 2;
}
int main() {
    POINT* pstPoint = nullptr;
    pstPoint = (POINT*)malloc(sizeof(POINT));
    AssignPoint(&pstPoint);
    cout << pstPoint->a << " " << pstPoint->b << endl;
    return 0;
}

分析一下两种实现方式的原理和区别个人理解仅供参考

  • 使用第一种方式时在main函数内声明的stPoint变量存放在栈空间,并在栈空间开辟了一块空间用于存放POINT数据。
    此时对stPoint取地址得到它所在的地址(也就是所谓的一级指针,此指针指向POINT的栈空间)。将此地址作为实参传递给p_pstPoint时,p_pstPoint有自己的栈地址,其指向POINT的栈空间。所以stPoint和p_pstPoint指向同样的栈地址,所以对p_pstPoint指向的栈地址赋值,stPoint也能取到。当stPoint作用域结束时,这块栈空间自动被释放掉。
  • 使用第二种方式时在main函数声明的pstPoint 初始化指向nullptr空间。也就是pstPoint 有自己的栈地址,其指向一个为空的堆空间。再通过malloc对其分配堆空间使其指向一个部位

通过返回值进行赋值

通过返回结构体指针或者返回结构体变量

你可能感兴趣的:(C++,c++,c,结构体,指针)