对指针的进一步理解

近期由于项目收尾,时间比较充裕,故翻看了大量的面试题,其中多以Linux C+网络知识为主,对以往C的知识盲点也有了进一步认识。

本篇文章的编写侧重于对C语言的指针的理解,总结一下与大家共同温习、巩固。


其中有一道面试题:不利用库函数,实现strcat,下面两种实现方法中哪一个正确的?为什么?


方法一:

char  *my_strcat(char *dest,char *src)

{

char *retp = dest;

if(dest == NULL || src == NULL) return;

while(*dest++);

while(*dest++ = *src++) ;

return retp;

}


方法二:

char  *my_strcat(char *dest,char *src)

{

char *retp = dest;

if(dest == NULL || src == NULL) return;

while(*dest)

dest++;

while(*dest++ = *src++) ;

return retp;

}


乍一看,好像两种方法的区别并不大,区别为第一个while循环

方法一中第一个while循环为

while(*dest++);

方法二中第一个while循环为

while(*dest)

dest++;


首先需要说明的是方法二是正确的,方法一是错误的。

其实题目比较迷惑人的是对 * 和 ++ 的应用,首先应该明确的是当对字符串的处理中同时应用上述两个符号时,它们的结合顺序为自右向左的

所以 char *sp = "abcd";

*sp++ 与 *++sp是不同的,

*sp++ 的值为‘a’,但此时sp指向的是字符' b';

*++sp 的值为' b',但此时sp指向的是字符' b';

如果读者此时存在疑惑,说明对最基本的 ++ 运算了解的还不是很透彻,

例如 int a = 1;

a++ = 1,此时a = 2;

++a = 2,此时a = 2;


返回题目中来,对上述两个while拆解来看,假如此时dest 指向的字符串“abcd”

char *dest = "abcd";

dest++;

printf("%c\n",*dest);//此时输出‘b’,dest也指向字符' b' 的位置

char *dest = "abcd";

char ch = *dest++;

printf("%c\n",ch);//此时输出' a ',但是dest指向字符' b' 的位置


所以方法一中的第一个while循环 

 while(*dest++); 

最后一次判断为 *dest++ == ' \0',即为字符串dest 的结束标志' \0' ,则结束循环,但是此时dest指向的‘ \0’的下一个地址空间

所以此时在应用第一个while循环实现字符串连接,实际上将源字符串src接到了目的字符串dest结束符' \0' 的下一个地址空间,两个字符串中中间还夹着一个' \0'

此时返回的rep 仍然指向的是dest串


方法二中的第一个while循环 

while(*dest)

dest++;

最后一次判断为dest++ == ‘ \0’,即为字符串dest 的结束标志' \0' ,则结束循环,但是此时dest指向的‘ \0’

所以此时在应用第二个while循环实现字符串连接,实际上将源字符串src接到了目的字符串dest结束符' \0' 位置上,成功实现了字符串连接。


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值