问题代码:
函数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可以被修改也是不允许的这样写的。