结构体在函数传值时的一点笔记

本文记录了结构体在函数传值时的几种用法,包括直接传值、指针传值和二级指针传值。结构体直接传值只能读取数据,指针传值能读取和修改数据,而二级指针传值还能修改指针本身。在使用二级指针时,需要注意成员访问的语法优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在写代码的时候,因为不清楚结构体在传值时的用法,每次函数调用后,并没有将结果正常传递出来,于是,便有了这篇文章
首先,上代码

/*******************************************************************************
  程序员      : enjoy
  最后修改时间: 2016年3月29日 13:19:37
  函数说明    : 本函数用于测试结构体在函数传值的时候的引用方式以及结构体指针在
                函数传值时的引用方式,本代码更详细的解释,请看本人博客

*******************************************************************************/

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

//测试的结构体,包含整型,数组,指针
typedef struct
{
    int x;
    int y;
    char name[5];
    struct DNode *next;
}DNode;

/*
  函数说明:
      测试的是结构体指针在函数传值时的用法,因为会将传入参数Node修改之后的结果传
      递回去,所以采用了二级指针,**Node是实际的结构体所在的内存,*Node是一个四字
      节的指针,指向实际内存,Node是一个二级指针,指向*Node这个指针所在的内存地址
  输入参数:
      二级结构体指针
  输出函数:
      一级结构体指针
*/
DNode* testPoint(DNode **Node)
{
    DNode *mNode = NULL;

    //正常的一个结构体指针的创建与初始化
    mNode = (DNode*)malloc(sizeof(DNode));
    mNode->x = 1;
    mNode->y = 1;
    mNode->next = NULL;
    strcpy(mNode->name,"test");

    *Node = mNode;

    return mNode;
}

/*
  函数说明:
      测试的是结构体传值,因为需要将Node的改变传递出去,所以采用一级指针输入
  输入参数:
      一级结构体指针
  输出函数:
      结构体
*/
DNode test(DNode *Node)
{
    DNode mNode;

    mNode.x = 2;
    mNode.y = 2;
    mNode.next = NULL;
    strcpy(mNode.name,"test");
    *Node = mNode;

    return mNode;
}

/*
  函数说明:
      测试的是结构体指针在传值的用法,因为不用将结果传递出去,所以可以将结构体指
      针直接传递进来,注意如果是用二级指针传递的,在结构体引用时(*Node)->要用括号
      因为->的优先级大于*
  输入参数:
      一级结构体指针
  输出参数:
      空值
*/
void Destory(DNode* Node)
{
    DNode *nextNode = Node;
    int i = 0;

    for(;;)
    {
        if(Node->next != NULL)
        {
            nextNode = Node->next;
            free(Node);
        }
        else
        {
            free(Node);
            break;
        }       
    }
}

/*
  函数说明:
      主函数
  输入参数:

  输出参数:

*/
int main(void)
{
    DNode *aNode = NULL;
    DNode *bNode = NULL;
    DNode cNode;
    DNode dNode;

    printf("hello world!!\n");

    aNode = testPoint(&bNode);
    cNode = test(&dNode);


    Destory(aNode);

    return 0;
}

通过上面代码.可以看到结构体在函数传值时用法跟数组有点像

对于一般的结构体调用
这里写图片描述

对于需要修改结构体内容时的调用
这里写图片描述

对于需要修改结构体指针时的调用
这里写图片描述

所以综上所述,我总结一下,在函数调用时
结构体直接传值:
可以使用相应结构体的数据
结构体指针传值:
可以使用并修改相应结构体的数据,并且可以使用相应结构体指针
结构体二级指针传值:
可以使用并修改相应结构体的数据,并且可以修改并使用相应结构体指针

需要注意的是,在二级指针传递时,使用内部成员要(*Node)->x,因为->的优先级比*高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值