当前位置: 首页 > article >正文

C语言之写一个修改数组内容的函数

问题代码:

在这里插入图片描述
函数ltrim是为了消除buf字符数组中左边空格,
memmove函数介绍
在这里插入图片描述
如果对c语言指针运用非常熟练的人,结合函数功能就会发现这个代码非常的傻逼,你会发现为什么需要返回,buf不用接收返回值,执行这个函数后buf中的内容就已经被改变。

正确的应该这样写:

在这里插入图片描述

收获与感悟:

1、我感觉在代码中,变量名与其所指代的值是key和value的关系,在需要value做运算与条件判断时,编译器或解释器就会进行根据key查找到value进行替换
例如:

int a=10;
char *str="你好世界\0"

这里我们可以看做两个c++中的pair结构,

[
	{
		key:"a",
		value:10
	},
	{
		key:"str",
		value:"字符串首地址”
	}
]

在这个的基础上我们理解指针做函数参数时,

func(str)

我们将key值为str的pair结构传入函数,在需要对value其进行操作时,如:

*str
*(str+1)

编译器或解释器将替换成value

*(0x12345)
*(0x1235+1)

ps:以上纯是自己的胡乱理解。

2、在第一张图中你们可以发现
buf=ltrim(buf),提示 “表达式必须是可修改的左值”,
1、可以浅显的理解为buf是 char *const 类型,明确buf的地址不能修改,但是这只能作为一个”偏方“记忆不能一个数组直接赋值给另一个数组,将一个指针赋给数组标识符,但这个将buf理解为char *const也是错误的。

char buf2[256]={'0'};
buf=buf2;//同样不被允许会触发报警

2、但其实我们需要明确buf指代的是数组,而数组是数组,指针是指针,数组可以被编译器转换为指针。
例如:

void ltrim(char str[]);

上面的函数应该会被预编译器替换为

void ltrim(char *str)

而指针不能转换为数组,所以在第一张图中
就算buf可以被修改也是不允许的这样写的。

以上纯属个人理解,大概都是问题,不要盲目相信


http://www.kler.cn/a/382489.html

相关文章:

  • 查看 linux ubuntu 分区 和 挂载 情况 lsblk
  • 第9天:网络编程-补充材料——‘MainActivity.kt‘解读
  • nVisual标签打印模块的部署与使用
  • WebAPI编程(第五天,第六天,第七天)
  • 【MWorks】Ubuntu 系统搭建
  • golang 实现比特币内核:处理椭圆曲线中的天文数字
  • 【ChatGPT】如何使用条件逻辑让ChatGPT生成可选输出
  • 开源思维-到底什么是开源?
  • 【Allure】allure装饰器函数
  • java面试2.0
  • HTML 标签属性——id、class、style 等全局属性详解
  • 【Rust中的迭代器】
  • 综述一部分Knowledge Graphs Meet Multi-Modal Learning:A Comprehensive Survey
  • C 学习(4)
  • 探索信息技术的未来:趋势、机遇与挑战
  • 【MySQL系列】区分大小写与支持表情字符的考量
  • 2024年,私域还好做吗?(三)
  • Spring Boot关闭时,如何确保内存里面的mq消息被消费完?
  • OpenAI 的 正式版o1 模型意外泄露,推理能力真是震撼——事情是这样的
  • springboot2.x使用SSE方式代理或者转发其他流式接口
  • STL整理
  • WebSocket实现消息实时推送
  • C# 一个工具类让winform自动根据窗体大小缩放所有控件
  • 【EasyExcel】EasyExcel导出表格包含合计行、自定义样式、自适应列宽
  • Rust 构建 TCP/UDP 网络服务
  • 导航栏渐变色iOS