结构体指针变量与结构体指针形参的关系(C语言一)

您所在的位置:网站首页 函数做形参 结构体指针变量与结构体指针形参的关系(C语言一)

结构体指针变量与结构体指针形参的关系(C语言一)

2024-07-11 04:25| 来源: 网络整理| 查看: 265

结构体指针变量与结构体形参的关系 一、结构体指针变量的声明二、结构体指针做形参三、如何通过形参更改主函数里的结构体变量的数据

一、结构体指针变量的声明

声明结构体时,我们首先需要声明一个结构体,然后用typedef对结构体进行修饰,这样才可以创建相关结构体的变量类型。具体做法看一下代码:

#include typedef struct STU{ int age; char *name; }STU; int main() { /* 声明结构体STU类型的变量。说明一下,给赋值为NULL是一个良好的习惯。 */ STU *stu = NULL; return 0; } 二、结构体指针做形参

在学会如何声明结构体变量指针之后,接下来我们看一下函数中传递结构体类型的指针形参变量:

#include typedef struct STU{ int age; char *name; }STU; void initStu(STU **stu); void initStu(STU **stu) { /* 这个条件判断只是为了检测指针的合法性,避免出现内存泄漏。 如果不能理解可以跳过这个条件判断。 */ if (NULL == stu || *stu != null) { return NULL; } *stu = (STU*) calloc(sizeof(STU), 1); (*stu)->age = 12; (*stu)->name = "张三"; } int main() { STU *stu = NULL; initStu(&stu);//结构体指针类型的实参 return 0; }

上面就完成了结构体类型的实参传递。

三、如何通过形参更改主函数里的结构体变量的数据

看完上面的代码,不知道有没有人有这种想法:*stu可以看成声明了一个只有一个变量空间大小的数组STU stu[1],stu他已经是一个地址了,为什么还要传递&stu才可以改变结构体里面变量的值呢? 小编在学习到这一块的时候脑海中就浮现了这个疑问。下面,小编就谈谈为什么为什么要用**stu类型的形参

首先,我得解释一下,将结构体变量名称作为结构体的首地址只是在个别编译器中有这样的功能。大部分编译器不支持该做法。所以我们介绍的主要是不支持该做法的编译器。

第一种理解 initStu(),这个函数的功能就是对变量stu进行初始化的。初始化之前stu的值为NULL,而初始化之后应该将其原本的值改了(具体改成多少,由calloc()函数决定)。我们都知道,在函数体里面想要改变主函数变量的值,必须将该变量的地址传入进去,所以我们现在为了在函数体里面将stu的值改变,就必须传入&stu。而stu本身就是一个一维指针,所以取地址后的值就变成了二维指针变量类型。因此用STU **stu

第二种理解 stu是该数组的首地址,这一点问题都没有。但是,在学习结构体数组的时候,相信大家都知道stu[0]就代表一个结构体变量,既然他是一个变量,而我们在函数体里面需要改变主函数里面变量的值时,往往传递进去的是变量的地址,所以我们在进行传递的时候就是需要将&stu[0]传递进去,这样才可以改变结构体里面变量的值。而stu[0]就等价于*stu。所以我们需要将形参变量声明成为**stu。

以上就是我个人的理解。如果哪里推理的有问题,欢迎大家指出。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3