一、封装mystrcpy指针函数实现strcpy功能
1、代码实现纯享版 :
2、个人注解版:
1)以上有我个人注解分析,编号前有$说明我初次写时掉过的坑,或者迷糊的点。
2)需要再解释说明一下:
① 注释1:
(错) 因为我们这个指针函数是一个套嵌类型了,内部返回和外部要再进行一回。所以第一次结束后的pdst指向的就不是该地址的首地址,我们第二次外部要再进行的时候就无法达到我们的目标将str的内容复制给dst。所以我们定义一个指针去接收刚开始的pdst。这样我们第二次进行的时候pdst指向的就是该地址的首地址。(错)
上述言论纯属错误,我们在这里定义的原因是:进行完while循环时pdst++后对应的不是首地址(此时pdst虽然已经完成了内容的拷贝),这个过程我们改变了*pdst指向的空间地址,不再是首地址。所以在循环前定义了一个指针char *pret去接收我们没有进行 “pdst++” 操作前的首地址的位置。 就能在返回给主函数的时有pdst的首地址。
对比另外一种情况(字符串倒置):这里利用数组(指针特殊的一种),通过i的变化找到与之对应的值,这个过程我们没有改变指针*pstr指向的首地址,数组名永远指向的是数组的第一个元素。
② 注释7:
首先这是一个套嵌的指针函数,mystrcmp(str,"luck!"),这内部函数是最开始的一个指数函数,str 作为实参1传给了函数中形参 char *pdst,"luck!" 作为实参2传给形参char *pstr。经过函数体的运算后得到的将 "luck!" 复制给了str这一结果的返回的值给了 mystrcmp(str,"luck!")。而这一部分又作为外部函数的形参2传给了 char *pstr , dst 作为形参1传给了 char *pdst。再通过运算得到了最终复制成功的dst。
言简意赅的说就是,内部函数先把 str 和 "luck!" 作为实参传给形参代码运行后的到"luck!"复制给了 str 。而这一整体和 dst ,又构成了外部函数实参和形参去进行。
构成 "luck!" 复制给 str ,str 复制给了 dst 。
总结:本文讨论了通过封装mystrcpy指针函数实现strcpy功能的实现方法。
关键点包括:
1)需要定义辅助指针pret保存首地址,因为pdst++操作会改变指针位置;
2)这是一个嵌套指针函数,内部函数先将"luck!"复制给str,外部函数再将str复制给dst。详细分析了指针操作中的常见误区,特别是地址变化对函数返回结果的影响,并与字符串倒置操作进行了对比说明。