C语言结构体传参

article/2025/9/18 23:32:33

目录

  • C语言结构体传参
    • 1. 普通传参
        • 1.1 测试代码
        • 1.2 测试结果
        • 1.3 结果分析
    • 2. 单指针传参
      • 2.1 修改结构体数据
        • 2.1.1 测试代码
        • 2.1.2 测试结果
        • 2.1.3 结果分析
      • 2.2 修改结构体地址
        • 2.2.1 测试代码
        • 2.2.2 测试结果
        • 2.2.3 结果分析
    • 3. 双指针传参
        • 3.1 测试代码
        • 3.2 测试结果
        • 3.2 结果分析

C语言结构体传参

结构体传参包括三种传参方式

  1. 普通传参:函数接收到结构体参数后,会复制一份原来的结构体作为形参供函数使用,而函数内的任何操作都是对拷贝结构体的修改,不会影响到原本的结构体变化。
  2. 单指针传参:函数接收的是一个结构体的地址,该指针指向的是结构体起始地址,也就相当于传入了结构体内所有变量的地址,函数接收到该结构体指针后,我们就可以根据地址访问结构体中每个变量的真实数据,在函数内对结构体内数据的操作,都会影响到原本结构体内数据的变化
  3. 双指针传参:函数接收的是结构体指针变量的地址,因为一级指针代表的是结构体的地址,在函数中能够操作结构体内的数据,则二级指针指向的是结构体的地址,则同理我们可以根据二级指针访问修改结构体的地址
    即通过一级指针,对结构体内数据的操作会影响到原本结构体内数据的变化
    而通过二级指针,对结构体地址的操作会影响到原本结构体地址的变化,例如为结构体分配空间

1. 普通传参

1.1 测试代码

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{int age;struct Node *next;
} Node;// 普通传参
void test(Node p)
{printf("test():\n");printf("数据: p.age = %d\n", p.age);printf("地址: p = %x, p->next = %x\n\n", &p, p.next);// 在函数内定义一个新的结构体Node q;q.age = 3;q.next = NULL;// 修改结构体内的数据p.age = 2;p.next = &q;printf("数据: p.age = %d\n", p.age);printf("地址: p = %x, p->next = %x\n", &p, p.next);printf("数据: q.age = %d\n", q.age);printf("地址: q = %x, q->next = %x\n\n", &q, q.next);
}int main()
{Node p;p.age = 1;p.next = NULL;printf("main():\n");printf("数据: p.age=%d\n", p.age);printf("地址: p=%x, p->next=%x\n\n", &p, p.next);test(p);printf("main():\n");printf("数据: p.age=%d\n", p.age);printf("地址: p=%x, p->next=%x\n\n", &p, p.next);return 0;
}

1.2 测试结果

在这里插入图片描述

1.3 结果分析

由结果可得,通过普通传参

  • 函数内的操作对原结构体没有影响
  • p结构体的地址、数据均未发生变化

其流程如下图:
在这里插入图片描述

2. 单指针传参

2.1 修改结构体数据

2.1.1 测试代码

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{int age;struct Node *next;
}Node;// 单指针传参,修改结构体数据
void ModifyData(Node *p)
{printf("ModifyData:\n");printf("数据: p.age = %d\n", p->age);printf("地址: p = %x, p->next = %x\n\n", p, p->next);// 在函数内定义一个新的结构体Node q;q.age = 3;q.next = NULL;// 修改数据(age,next)p->age = 2;p->next = &q;printf("数据: p.age = %d\n", p->age);printf("地址: p = %x, p->next = %x\n\n", p, p->next);printf("数据: q.age = %d\n", q.age);printf("地址: q = %x, q->next = %x\n\n", &q, q.next);}int main()
{Node p;p.age = 1;p.next = NULL;printf("main():\n");printf("数据: p.age = %d\n", p.age);printf("地址: p = %x, p->next = %x\n\n", &p, p.next);ModifyData(&p);printf("main():\n");printf("数据: p.age = %d\n", p.age);printf("地址: p = %x, p->next = %x\n\n", &p, p.next);return 0;
}

2.1.2 测试结果

在这里插入图片描述

2.1.3 结果分析

通过ModifyData()函数,由以上测试结果可得

  • p结构体内的数据发生了变化
  • p结构体的原地址没有发生变化

所以通过结构体的地址,我们可以找到数据的真实地址,进而修改真实数据
在这里插入图片描述

2.2 修改结构体地址

2.2.1 测试代码

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{int age;struct Node *next;
}Node;// 单指针传参, 尝试修改结构体地址
Node *ModifyAddress(Node *p)
{printf("ModifyAddress():\n");printf("数据: p.age = %d\n", p->age);printf("地址: p = %x, p->next = %x\n", p, p->next);printf("形参指针变量p的地址 = %x\n\n", &p);// 尝试为指针重新分配地址,并修改原本结构体内部数据p = (Node *)malloc(sizeof(Node));p->age = 4;p->next = NULL;printf("数据: p.age = %d\n", p->age);printf("地址: p = %x, p->next = %x\n", p, p->next);printf("形参指针变量p的地址 = %x\n\n", &p);// 返回修改后的结构体指针preturn p;
}int main()
{Node p;p.age = 1;p.next = NULL;printf("main():\n");printf("数据: p.age = %d\n", p.age);printf("地址: p = %x, p->next = %x\n\n", &p, p.next);Node *new_p = ModifyAddress(&p);printf("main():\n");printf("数据: p.age = %d\n", p.age);printf("地址: p = %x, p->next = %x\n", &p, p.next);printf("数据: new_p.age = %d\n", new_p->age);printf("地址: new_p = %x, new_p->next = %x\n\n", new_p, new_p->next);return 0;
}

2.2.2 测试结果

在这里插入图片描述

2.2.3 结果分析

由以上结果可得,在调用函数体内修改结构体的地址,对原结构体A没有任何影响,因为在调用函数体内修改了形参p的地址,就代表了指针p指向了另一片结构体空间B,如果修改结构体B的内容,这对结构体A来说完全就是八竿子打不着。
在这里插入图片描述
由上图我们可以知道,我们在函数内重新开辟了一个新的结构体空间 [731250],而通过动态开辟的空间在函数调用完毕后是不会被释放的,所以在函数调用完毕后,我们仍然可以通过地址 [731250] 访问该结构体的数据,而如果不再使用,我们应该及时释放掉该空间free()

3. 双指针传参

3.1 测试代码

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{int age;struct Node *next;
} Node;// 双指针传参
void test(Node **p)
{printf("test:\n");printf("数据: p.age = %d\n", (*p)->age);printf("地址:p = %x, (*p) = %x, (*p)->next = %x\n", p, (*p), (*p)->next);printf("指针p的地址 = %x\n\n", &p);// 在函数内定义一个新的结构体Node q;q.age = 3;q.next = NULL;// 为结构体(*p)重新分配地址,并修改变量数据(*p) = (Node *)malloc(sizeof(Node));(*p)->age = 2;(*p)->next = &q;printf("数据: p.age = %d\n", (*p)->age);printf("地址:p = %x, (*p) = %x, (*p)->next = %x\n", p, (*p), (*p)->next);printf("指针p的地址 = %x\n\n", &p);printf("数据: q.age = %d\n", q.age);printf("地址: q = %x, q->next = %x\n\n", &q, q.next);
}int main()
{Node *p;// 为指针结构体p分配地址p = (Node *)malloc(sizeof(Node));p->age = 1;p->next = NULL;printf("main():\n");printf("数据: p.age = %d\n", p->age);printf("地址: p = %x, p->next = %x\n", p, p->next);printf("指针p的地址 = %x\n\n", &p);test(&p);printf("main():\n");printf("数据: p.age = %d\n", p->age);printf("地址: p = %x, p->next = %x\n", p, p->next);printf("指针p的地址 = %x\n\n", &p);return 0;
}

3.2 测试结果

在这里插入图片描述

3.2 结果分析

由结果可得,通过双指针传参,我们可以对结构体的数据和地址都做出实际修改。
其流程如下图:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/IyZL5stI.shtml

相关文章

C语言 结构体

1什么是结构体 结构体是一种集合&#xff0c;它里面包含了多个变量或数组&#xff0c;它们的类型可以相同&#xff0c;也可以不同&#xff0c;每个这样的变量或数组都称为结构体的成员。结构的成员可以是标量、数组、指针&#xff0c;甚至是其他结构体。 2结构体的定义 (1&a…

c语言:结构体(详解)

初识结构体 一.结构体声明1.结构体的概念2.声明 二.结构体的基础使用三.结构体变量的定义和初始化四.空结构体五.柔性数组1.定义2.使用 六.结构体内存对齐七.位端 一.结构体声明 1.结构体的概念 结构体是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同…

C语言结构体详解

目录 一、结构体的基本概念 举个例子 二、结构体变量 三、结构体占用的内存情况 举个例子 运行效果 再次运行 四、结构体的变量名 五、结构体初始化 五、结构体初始化 举个例子 运行效果 六、结构体成员的访问 举个例子 运行效果 八、结构体指针 举个例子 运行效…

C语言结构体超详解(小白一看就懂,多维度分析!!!!)

目录 一、前言 二、结构体详解 &#x1f350;什么是结构体 &#x1f34e;结构体的定义与基础结构 &#x1f351;结构体的使用 &#x1f4a6;结构体的初始化 &#x1f4a6;结构体的成员访问 &#x1f4a6;结构体数组 &#x1f4a6;结构体指针--------------指向结构体变…

C语言之结构体(进阶篇)

目录 1.结构体的内存对齐​ 如何计算呢&#xff1f;​ 掌握结构体的对齐规则&#xff1a; 为什么存在内存对齐呢&#xff1f;​ ​​​​​​​offsetof​ 位段​ 什么是位段&#xff1f;​ 比如&#xff1a; 位段的内存分配​ 举个例子 位段的跨平台问题&#xff1a;​ 枚举…

C语言——结构体(全)

目录 一、结构体的设计 二、结构体变量的初始化 2.1结构体在内存表示&#xff1b; 2.2结构体初始化&#xff1b; 2.3结构体指针变量 2.4结构体嵌套结构体 三、结构体成员访问 3.1、结构体成员访问 3.2、结构体变量和指针 ​3.3、结构体和函数 四、结构体与数组 五、…

Github客户端下载慢的解决方法

Github客户端下载慢的解决方法 Github客户端下载解决方法获取下载连接 Github客户端下载 Github客户端的下载地址是——Github客户端下载。 但是下载速度特别慢&#xff0c;最快也就十几K。 解决方法 使用迅雷下载&#xff1a;将Github客户端的下载地址复制到迅雷中&#…

windows平台下使用Github(2 创建代码仓库,安装Github客户端.)

本文会分章节的来介绍如何在windows平台下使用GitHub 一、注册Github账号 查看 二、创建代码仓库&#xff0c;安装Github客户端.查看 三、Github上传和下载(1 客户端方式)查看 四、Github上传和下载(2 命令行方式)查看 1、创建一个代码托管仓库。 点击右上角的 号或者点…

github客户端进行token认证

从 2021 年 8 月 13 日起&#xff0c;GitHub 在对 Git 操作进行身份验证时不再接受帐户密码。您需要添加 PAT&#xff08;个人访问令牌&#xff09;&#xff0c;您可以按照以下方法在您的系统上添加 PAT。 git - Support for password authentication was removed. Please us…

【解决】GitHub 客户端下载后安装在哪里?

GitHub Desktop 配置环境变量GitHub 安装路径GitHub Shell、Bash 环境是 Windows 10。 从 GitHub 官网下载了 GitHub 的 Desktop 版本之后&#xff0c;它其实不仅是一个 GUI&#xff0c;还带了 Shell&#xff08;Bash&#xff09;&#xff0c;但是发现找不到它们是被安装在哪个…

GitHub客户端上传本地代码

创建GitHub账号、安装GitHub客户端登录GitHub网站、在客户端登录账户创建新的代码存放处 填写及勾选一些信息 复制此代码存放处的路径 利用客户端上传代码 第一步&#xff1a;点击第五步的Open in Desktop&#xff0c;打开本地客户端 第二步&#xff1a;点击下图蓝色选中选…

你们心心念念的 GitHub 客户端终于来了!

点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 For something,we cant understand when we are young but by the time we understand,we are no longer young. 有些事情&#xff0c;当我们年轻的时候无法懂得&#x…

GitHub客户端的使用方法

一&#xff1a;创建自己的GitHub账号 GitHub官网链接 https://github.com/ 自行创建账号&#xff0c;因本文主要介绍GitHub客户端的使用方法&#xff0c;所以注册账号略 二&#xff1a;下载GitHub客户端 GitHub客户端下载的官网链接 https://desktop.github.com/ 下载完成之…

gitHub客户端的安装与使用总结

一、第一步 注册github账号 1.注册界面 https://github.com/&#xff0c;如下图&#xff1a; 2.下注册流程 3.上面简单的输入一下用户名、邮箱地址、密码点击创建即可&#xff0c;进入下一步&#xff0c;如下图&#xff1a; 如果勾选了“Help me set up an organization next”…

Github客户端安装使用教程(一)

转载请注明出处&#xff0c;http://blog.csdn.net/bule_zst/article/details/74185268 1. 下载安装 下载地址 下载好后双击运行&#xff0c;这个安装程序比较奇葩&#xff0c;是强制安装路径的&#xff0c;运行后什么界面都没有&#xff0c;后台安装&#xff0c;大概等到你觉…

GitHub Windows 客户端使用教程

GitHub Desktop tutorial 一、前期准备 下载安装 GitHub Windows 客户端&#xff0c;链接在这里。 二、登录账号 在客户端登录自己的 GitHub 账号。 三、选择要上传的 repository 进行 Clone 比如我 Clone 了 LeetCode-Solutions。 然后选择 URL 进行 Clone 。 进入主界面…

github客户端教程

在网上搜索了下github的教程,都是讲的用命令行去提交代码的,真心不想这么麻烦,都有客户端了,还去这么麻烦,程序员还要着干嘛呢.于是网上找了一份客户端的教程,转载过来. 一&#xff1a;下载GitHub for Windows 2.0 下载地址&#xff1a;https://windows.github.com/ 二&#xf…

github客户端使用

用github windows离线版安装好之后&#xff08;需要安装的请留邮箱&#xff09;。安装好之后桌面呈现 点击左侧图标进入客户端&#xff0c;进入登录界面如下图 输入帐号密码登录&#xff0c;如果没有去官网申请一个。 登录之后&#xff0c;先进行第一步&#xff0c;新建…

github客户端的下载

在github官网上&#xff0c;下载客户端完成后&#xff0c;安装时还需要下载一些文件。但是我之前安装了很多次&#xff0c;都是下载了20多M就停止了&#xff0c;提示下载终止。之后就只能从开始下载&#xff0c;一直安装不成功。一直停留了2周时间&#xff0c;期间也在网上搜过…

新手使用GitHub客户端提交本地项目到GitHub网站详细步骤

1.下载https://windows.github.com/ github客户端 2.安装完github&#xff0c;会出现 点击GitHub&#xff0c;Git Shell是命令行指令&#xff0c;暂时用不上 3.点击进入之后 输入你在https://github.com上面注册的用户名和密码点击log in 4.登录之后新建项目 点击左上角…