结构体二级指针案例

C语言中的二级指针(1) -- 值传递问题 先看一个我们非常熟悉的代码: #include void swap(int a, int b) { int tmp; tmp = a; a = b; b = tmp; } int main() { int a = 3, b = 5; swap(a, b); printf("a = %d, b = %d\n", a, b); return 0; }我们都知道,这段代码中的s 阅读详情
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

typedef struct _Teacher
{
	char*name;
	char**student;	//创建学生数组
}Teacher;

void allocateTeacherSpace(Teacher***tArr,int num)
{
	Teacher**TeacherArr = malloc(sizeof(Teacher*)*num);//创建num个Teacher*

	for (int i = 0; i < num;i++)
	{
		//给每个Teacher*开辟空间
		TeacherArr[i] = malloc(sizeof(Teacher));
		//给每个Teacher成员开辟空间
		TeacherArr[i]->name = malloc(128);
		TeacherArr[i]->student = malloc(sizeof(char*) * 5);
		for (int j = 0; j < 5; j++)
		{
			TeacherArr[i]->student[j] = malloc(128);
		}
	}
	*tArr = TeacherArr;
}

void nameTeacher(Teacher**tArr,int num)
{
	for (int i = 0 ; i < num; i++)
	{
		char buf[128] = { 0 };
		sprintf(buf, "Teacher_%d", i + 1);
		strcpy(tArr[i]->name, buf);
		for (int j = 0; j < 5; j++)
		{
			sprintf(buf, "T_%d_S_%d", i + 1, j + 1);
			strcpy(tArr[i]->student[j], buf);
		}
	}
}

void printMsg(Teacher**tArr, int num)
{
	for (int i = 0; i < num;i++)
	{
		printf("%s\n", tArr[i]->name);
		for (int j = 0; j < 5; j++)
		{
			printf("%s\t\t", tArr[i]->student[j]);
		}
		printf("\n\n");
	}
}

void freeMem(Teacher***tArr,int num)
{
	Teacher**pTeacher = *tArr;
	if (pTeacher==NULL)
	{
		return;
	}
	for (int i = 0; i < num; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			free(pTeacher[i]->student[j]);
			pTeacher[i]->student[j] = NULL;
			printf("释放T%d的学生S%d的内存\n", i + 1, j + 1);
		}
		free(pTeacher[i]->name);
		pTeacher[i]->name = NULL;
		printf("释放T%d的name内存\n", i + 1);
		free(pTeacher[i]->student);
		pTeacher[i]->student = NULL;
		printf("释放T%d的student内存\n", i + 1);
		free(pTeacher[i]);
		pTeacher[i] = NULL;
		printf("释放T%d的内存\n", i + 1);
	}
	free(pTeacher);
	printf("释放Teacher的内存\n");
	*tArr = NULL;
}

void test11()
{
	//堆区创建Teacher数组
	Teacher**tArr = NULL;
	int tNum = 9;
	allocateTeacherSpace(&tArr, tNum);
	//给Teacher数组赋值
	nameTeacher(tArr, tNum);
	printMsg(tArr, tNum);
	freeMem(&tArr, tNum);
}

int main()
{
	test11();
	system("pause");
	return 0;
}
告别Keil/IAR:在VSCode中用CMake+Clangd打造丝滑的STM32开发环境(附完整配置) 本文详细介绍了如何在VSCode中使用CMake和Clangd搭建高效的STM32开发环境,替代传统的Keil/IAR工具。通过完整的配置指南和快速开发技巧,帮助开发者实现轻量级、高度可定制的现代化开发流程,显著提升STM32项目的开发效率。 阅读详情

相关推荐

WinCC7.5SP2生成PDF报表显示有错误或残缺的问题及解决方法

WinCC V7.5 SP2 自带的生成PDF报表功能异常。生成的PDF报表内容显示空白或有残缺。经测试后发现可以通过替换Adobe PDF Library库文件的方法解决该问题。

commandboy的博客 3660

Record20—二级指针的输出模型

二级指针的输入输出模型

恋蛩音的博客 266

RK3576开发板ROS2部署实战:从Buildroot配置到Hello World Demo

本文详细介绍了在RK3576开发板上部署ROS2的完整实战流程。从Buildroot工程配置、集成ROS2依赖,到搭建Docker交叉编译环境、处理编译难题,最终完成系统镜像打包并在板端成功运行Talker-Listener Demo。该指南旨在帮助开发者深入理解嵌入式机器人系统的构建链,实现从底层到应用的完全掌控。

mac99的博客 1159

结构体中包含二级指针案例

给出如下结构体,要求全部在堆区开辟空间。有多个老师,每个老师有多个学生。 typedef struct { char *name;//老师 int stu_num;//学生数 char **stu_arr;//学生名字 }TEACHER; 需要注意以下问题: 此问题使用双层循环即可解决。 外层循环处理这三个成员变量:给name开辟空间;给stu_num赋值;给stu_arr开辟5个...

Hello_MyDream的博客 2万+

STM32 SYSTICK定时器及延时函数详解

STM32 SYSTICK及延时函数详解 SysTick定时器 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心

w1050321758的博客 2368

S7-1200与KINCO伺服通信实战:CM CANopen模块配置避坑指南(附完整PDO映射表)

本文详细解析了西门子S7-1200 PLC通过CM CANopen模块与KINCO伺服驱动器的通信配置全流程,重点解决PDO映射混乱、心跳报文配置错误等常见问题。提供硬件组态、参数设置、PDO映射模板及故障排查方案,助力工业自动化系统实现稳定高效的多轴运动控制。

2y3u4i5o6p的博客 1102

结构体二级指针使用示例

#define INPUT_CNT 5 struct InputDataInfo { int iVal; double dVal; }; void struct2PointerTest() { InputDataInfo* pInfo[INPUT_CNT] = {0}; for (size_t i = 0; i < INPUT_CNT; i++) { pInfo[i] = new (std::nothrow) InputDataInfo(); if (pInfo[i]) {.

langxm2006的专栏 394

37.华为路由器:loopback(本地回环)接口的作用

本地环回接口(或地址),亦称回送地址(loopback address)。 此类接口是应用最为广泛的一种虚接口,几乎在每台路由器上都会使用。常见于如下用途: 1 作为一台路由器的管理地址 系统管理员完成网络规划之后,为了方便管理,会为每一台路由器创建一个loopback 接口,并在该接口上单独指定一个IP 地址作为管理地址 ,管理员会使用该地址对路由器远程登录(telnet ),该地址实际上起到了类似设备名称一类的功能。 但是通常每台路由器上存在众多接口和地址,为何不从当中随便挑选一个呢 ? 原因如下:由于

迷逝 3万+

C语言结构体

C语言结构体

m0_52867657的博客 1631

DDR5中的On-Die Termination(ODT)详解:电阻值支持及其背后的秘密

DDR5支持多档ODT电阻值,范围从40Ω到480Ω,均基于240Ω标准参考电阻RZQR_{ZQ}RZQ​。不同电阻档位对应不同的信号负载和功耗需求。校准电压点关键,常用0.8×VDD进行精准调校。CA信号间ODT匹配必须严格控制,保证命令总线稳定。选择合适的ODT值是高速内存设计中不可忽视的细节。

weixin_43199439的博客 2100

CDMamba安装配置Windows(50系列的显卡)

本人家里的显卡是RTX3050的,运行起来非常缓慢,大家可以参考上一篇文章,以下是用RTX5080配置的CDMamba,里面有一些库没有更新,因此会比较坑爹。就是pytorch已经更新了,搭配的是cuda12.8,但是cdmamba里的mmcv只更新到cuda12.1的版本,当然很多人会说那就向下兼容,但是笔者已经尝试了,会一直提示mmcv的问题。因此,索性直接不用mmcv。

hanfeng5268的博客 686

结构体指针的一些问题(包括二级指针)

结构体指针在平时工程中用的还是很多的,但是有时候如果有类似与二级的指针,可能就会有点乱。 结构体指针 一般来说我们先从定义结构体开始 比如: struct stduent{ int num; char *name; char sex; float score; }student1; 或者我们可以用typedef来重命名一下 typedef struct stdue...

weixin_36101480的博客 1178

Pytorch实用教程:super(MLP,self).__init__()和super().__init__()有什么区别?

在 Python 中,super()函数用于调用父类(超类)的方法。它的使用在继承关系中非常常见,特别是在初始化继承自父类的属性时。在 PyTorch 中,这通常见于初始化nn.Module类的子类。super()的两种调用方式有微妙的差别,但在 Python 3 中常常用来达到同样的目的。这种写法在 Python 2 中非常常见。这里,super()被调用时需要指定当前类名(MLP)和当前实例(self。

若北辰 1026

结构体资源申请与二级指针初始化赋值案例

结构体与二级指针初始化赋值案例 记录下今天遇到的二级指针初始化一直失败问题,在二级指针申请和赋值的时候,要注意访问的是哪一个具体的地址,直接访问arr 是二级指针,访问arr[i] 其实也是二级指针(我的理解),访问(*arr)[i] 才是访问的真正的资源。 不建议这种初始化方式,编码建议里有一条就是 资源初始化和释放尽量在同一层级。 代码如下: typedefstruct{ charname[10]; uint32_tsize; }Example; int...

u012673734的专栏 493

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

学习c语言的第14天

在同一个函数里,若指针发生了偏移,并且没有额外的重置操作,在后续的循环里指针仍然会保持偏移后的位置,不会自动重置。用结构体与函数与数组的结合巩固知识体系(案例还是之前的选票系统)要注意结构体指针取值的符号是。和以前非结构体我们是用。之前的选票系统用指针来操作。结构体与指针的小应用。结构体二级指针的应用。

你的潜力远比你想象的更大,别给自己设限。 269

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

python ctypes 指针_Python与C/C++调用之ctypes,以及二级指针

python访问C/C++python的底层大部分都是C/C++实现,python和C和C++具有天然的互相调用优势;很多核心的算法库都是C/C++写的,在python开发过程中,经常访问别人的动态库;知名人工智能(深度学习)框架训练系统都是python写的,而运行时一般都是以动态库的形式提供;python访问C/C++的方式ctypes;pybind11;cffiswigctypes的优势不要修...

weixin_34177635的博客 2164

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

结构体成员变量指针与普通数据类型指针比较

写这篇文章的原因是,我很好奇链表的结点删除算法为啥修改了指针域的值就可以。 还是用代码来说事吧,简单的写一个测试案例: #include<stdio.h> typedef struct{ int* p; }*pstru; void ChangeIntPointerOne(int* p, int *q){ p = q;} void ChangeIntPointerTwo(i...

weixin_43971252的博客 2557

C语言 15.结构体和文件

1.结构体嵌套二级指针练习 struct Teacher { char* name; char** students; }; void allocateSpace(struct Teacher*** teachers) { if (teachers == NULL) { return; } //开辟内存 struct Teacher** ts = malloc(sizeof(struct Teacher*) * 3); //给

qq_44684289的博客 790

结构体指针和运用指针优化投票系统

结构体指针学习

weixin_55179981的博客 146

数据结构初始化的几种方式

先向内存中申请一个结构体大小的空间,创建一个结构体指针指向这个空间,我们传指针的地址,就可以改变指针的指向,在函数中我们初始化了一个指针指向我们想要的地址,让我们传来的指针的也指向这个地址就行了,这种方法其实本质就是第二种方法。传值的时候传的是一级指针,在上面函数中形参也是一个结构体指针并且只是我们的一个备份,这个备份的改变不会对我们传的实参有任何的影响,我们只有传二级指针才会对我们的实参有影响。

2201_75442971的博客 549

C语言链表之有序插入

C语言的指针是真的……难!当结构体遇上二级指针变成链表,指针变量变来变去对于我这种刚接触的小白真的晕,加上这几天感冒咳嗽流鼻涕,卡了好几天才初步掌握。 如下是课程案例有序插入链表节点的demo和主要代码: ...

arrow.light的博客 1312

深拷贝函数写不好,程序崩溃少不了,你还在用浅拷贝吗?

掌握C语言结构体指针的深拷贝函数编写方法,避免内存泄漏与程序崩溃。适用于复杂数据结构复制,通过递归分配内存并复制内容,确保数据独立完整。提升程序稳定性,值得收藏。

Algorift的博客 772

C语言 第九章 指针

C语言 指针

chasing_dreamsss的博客 2204

C高级编程

C语言

qq_61623880的博客 261

二级指针、指针数组、结构体

记录C语言小白的学习历程 二级指针、指针数组 结构体

2402_86037826的博客 1379

【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )

一、结构体中嵌套二级指针、 1、结构体中嵌套二级指针 类型声明、 2、为 结构体内的二级指针成员 分配内存、 3、释放 结构体内的二级指针成员 内存、 二、完整代码示例、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2640
上一篇: C语言精通大牛笔记DAY2_开辟内存与sscanf从字符串获取数据
下一篇: C语言精通大牛笔记DAY3_数组指针与选择排序
Coder_Ch1nA
博客等级 码龄7年 15粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值