C 语言字符串拷贝 ( 优化指针操作 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 语言字符串拷贝 ( 优化指针操作 )相关的知识,希望对你有一定的参考价值。
一、优化指针操作
在上一篇博客 【C 语言】字符串拷贝 ( 字符串拷贝业务逻辑代码 | 分离 主函数 与 字符串拷贝 业务模型 ) 的基础上 , 优化指针操作 ;
重点是 *to++ = *from++;
操作 , ++ 操作的优先级高于 * 操作 ;
上述代码中 , 先进行 *to = *from;
操作 , 然后进行 to++, from++;
优化后的指针操作 :
/*
* 实现字符串拷贝 ( 实现了模块化 )
* 将 from 指针指向的字符串 拷贝到 to 指针指向的字符串换
*/
void str_copy(char *from, char *to)
// 如果 from 指向的字符不为 \\0 , 则继续遍历
// 此处无法将 \\0 拷贝到 to 字符串中
for(; *from != '\\0'; from, to)
// 拷贝字符
*to++ = *from++;
// 将字符串最后一个字节拷贝过去
*to = '\\0';
二、优化指针操作 2
之前的字符串拷贝方法 , 总是需要在最后特别将 ‘\\0’ 字符拷贝过去 ;
// 将字符串最后一个字节拷贝过去
*to = '\\0';
使用下面的代码 , 直接在 循环条件 中进行拷贝赋值操作 , 从 from 指针指向的字符 拷贝到 to 指针指向的字符 , 如果拷贝的值不是 \\0 , 则指针累加 继续拷贝 , 如果拷贝的值是 \\0 , 就退出循环 ;
(*to = *from) != '\\0'
但是即使退出循环 , '\\0'
字符也拷贝成功了 , 这样就不需要额外拷贝 \\0 字符了 ;
优化后的函数代码 :
/*
* 实现字符串拷贝 ( 实现了模块化 )
* 将 from 指针指向的字符串 拷贝到 to 指针指向的字符串换
*/
void str_copy2(char *from, char *to)
// 从 from 指针指向的字符 拷贝到
// to 指针指向的字符
// 如果拷贝的值不是 \\0 , 则指针累加
// 如果拷贝的值是 \\0
// 这样就不需要额外拷贝 \\0 字符了
while((*to = *from) != '\\0')
from++;
to++;
三、优化指针操作 3
在 一、 中 , 有如下结论 : *to++ = *from++;
操作 , ++ 操作的优先级高于 * 操作 ; 上述代码中 , 先进行 *to = *from;
操作 , 然后进行 to++, from++;
借助该结论 , 继续优化 二、 中的代码 : 可以将 函数体 中的
from++;
to++;
操作 , 移植到循环条件中执行 ;
优化后的函数代码 :
/*
* 实现字符串拷贝 ( 实现了模块化 )
* 将 from 指针指向的字符串 拷贝到 to 指针指向的字符串换
*/
void str_copy2(char *from, char *to)
// 从 from 指针指向的字符 拷贝到
// to 指针指向的字符
// 如果拷贝的值不是 \\0 , 则指针累加
// 如果拷贝的值是 \\0
// 这样就不需要额外拷贝 \\0 字符了
while((*to++ = *from++) != '\\0')
四、优化指针操作 4
在 三、的基础上进行优化 , (*to++ = *from++)
表达式与 0
进行比较 , 0
可以理解成 FALSE , 非 0
可以理解为 TRUE ;
(*to++ = *from++)
等于 0 , 该表达式值就是 FALSE ;(*to++ = *from++)
不等于 0 , 该表达式值就是 TRUE ;
因此 , 这里可以直接将 (*to++ = *from++) != '\\0'
表达式后面的 != '\\0'
比较删除 ;
优化后的函数代码 :
/*
* 实现字符串拷贝 ( 实现了模块化 )
* 将 from 指针指向的字符串 拷贝到 to 指针指向的字符串换
*/
void str_copy2(char *from, char *to)
// 从 from 指针指向的字符 拷贝到
// to 指针指向的字符
// 如果拷贝的值不是 \\0 , 则指针累加
// 如果拷贝的值是 \\0
// 这样就不需要额外拷贝 \\0 字符了
while((*to++ = *from++))
以上是关于C 语言字符串拷贝 ( 优化指针操作 )的主要内容,如果未能解决你的问题,请参考以下文章
C 语言字符串拷贝 ( 指针使用前判空 | while 空语句 )