关闭

对指针的进一步理解

标签: 指针c语言面试题字符串
200人阅读 评论(0) 收藏 举报

近期由于项目收尾,时间比较充裕,故翻看了大量的面试题,其中多以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' 位置上,成功实现了字符串连接。


















0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:20784次
    • 积分:340
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:16篇
    • 译文:0篇
    • 评论:0条