记录学习C语言结构体

本文介绍了如何在C语言中使用结构体`Stu`,包括定义结构体、设置成员变量值(通过`set_stu`函数)、以及打印结构体内容(通过`print_stu`函数)。展示了如何通过指针操作结构体成员。

记录C结构体的简单使用

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

struct Stu //定义结构体
{
	//结构体成员
	char name[20];
	int age;
	double score;
};

void set_stu(struct Stu* ps)
{
	//名字文本是数组 不能直接复制 要用strcpy 同理 文本对比要用strcmp
	//第一种方法(*ps)
	//strcpy((*ps).name , "张三");
	//(*ps).age = 20;
	//(*ps).score = 100;
	//第二种方法 ps->
	strcpy(ps->name, "张三");
	ps->age = 20;
	ps->score = 100.00;
};

void print_stu(struct Stu s)
{
	printf("%s %d %lf\n", s.name, s.age, s.score);

}


int main()
{
	//创建结构体S
	struct Stu s = { 0 };
	//传址传参
	set_stu(&s);
	print_stu(s);

	return 0;
}
内容概要:本文围绕六自由度机械臂的人工神经网络(ANN)设计展开,重点研究了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程,并通过Matlab代码实现相关算法。文章结合理论推导与仿真实践,利用人工神经网络对复杂的非线性关系进行建模与逼近,提升机械臂运动控制的精度与效率。同时涵盖了路径规划中的RRT算法与B样条优化方法,形成从运动学到动力学再到轨迹优化的完整技术链条。; 适合人群:具备一定机器人学、自动控制理论基础,熟悉Matlab编程,从事智能控制、机器人控制、运动学六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)建模等相关方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握机械臂正/逆运动学的数学建模与ANN求解方法;②理解拉格朗日-欧拉法在动力学建模中的应用;③实现基于神经网络的动力学补偿与高精度轨迹跟踪控制;④结合RRT与B样条完成平滑路径规划与优化。; 阅读建议:建议读者结合Matlab代码动手实践,先从运动学建模入手,逐步深入动力学分析与神经网络训练,注重理论推导与仿真实验的结合,以充分理解机械臂控制系统的设计流程与优化策略。
### C语言结构体学习教程与使用指南 #### 基础概念 C语言中的结构体是一种复合数据类型,能够将不同类型的多个变量组合成一个整体。通过定义和操作结构体,程序员可以更方便地管理复杂的数据集合[^1]。 ```c struct Person { char name[50]; int age; float height; }; ``` 以上代码展示了如何声明一个名为`Person`的结构体类型,并包含了三个成员:字符串型的名字、整数型的年龄以及浮点型的高度。 --- #### 初始化方法 结构体可以通过多种方式进行初始化。最常见的方式是在定义时直接赋初始值: ```c struct Person p1 = {"Alice", 25, 170.5f}; ``` 如果仅部分字段需要初始化,则其余未指定的部分会被自动设置为零或空字符(取决于其类型)[^1]。 另一种方式是利用指针间接访问并初始化结构体的内容: ```c struct Person *p_ptr = malloc(sizeof(struct Person)); strcpy(p_ptr->name, "Bob"); p_ptr->age = 30; p_ptr->height = 180.0f; free(p_ptr); ``` 注意,在这种情况下要记得释放动态分配的空间以防止内存泄露[^5]。 --- #### 成员变量私有化 虽然标准C不支持像某些高级语言那样直接设定类属性权限控制机制,但我们仍然可以通过封装技术模拟实现类似的保护效果。例如把真正的数据存储隐藏起来只暴露必要的接口函数供外部调用[^2]。 假设有一个简单的银行账户模型: ```c // account.h 文件内容 #ifndef ACCOUNT_H_ #define ACCOUNT_H_ typedef struct Account Account; Account* create_account(const char*, double); void deposit(Account*, double); double get_balance(const Account*); void destroy_account(Account*); #endif /*ACCOUNT_H_*/ // account.c 实现细节省略... ``` 这样做的好处是可以有效限制外界随意修改内部状态的可能性从而提高软件的安全性和可靠性。 --- #### 数组形式的应用场景 当面对大量同质对象处理需求的时候,往往需要用到结构体数组的概念。下面给出一段关于学生信息录入的例子说明这一点[^3]: ```c #include <stdio.h> struct Student { int id; char name[50]; }; int main(){ struct Student students[3]; printf("请输入三位学生的ID和姓名:\n"); for(int i=0;i<3;++i){ scanf("%d %s",&students[i].id,&students[i].name); } puts("\n已记录的学生信息如下:"); for(int j=0;j<3;++j){ printf("ID:%d 名字:%s\n",students[j].id,students[j].name ); } } ``` 此程序片段实现了简单交互界面收集用户输入并将结果显示出来。 --- #### 赋值与深拷贝注意事项 对于含有指针作为组成部分的情况特别需要注意浅复制可能带来的隐患——即两个实例共享同一块底层资源而造成不可预期的行为模式发生改变等问题。因此推荐采用深层克隆策略解决此类风险[^5]。 示例见前述提到过的 `deepCopyData()` 函数演示过程。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值