对指针的进一步理解

原创 2015年11月17日 23:09:36

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


















版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

理解C语言——从小菜到大神的晋级之路(13)——进一步讨论函数与指针

本期视频:点击这里 1、main函数的参数         在我们编写的简单程序中,main函数常常是不带参数的。比如这样一个简单的程序,给main函数添加参数似乎也没什么意义: in...

[转载]C++中引用传递与指针传递区别(进一步整理)

转载自 http://xinklabi.iteye.com/blog/653643 这篇文章是在学习了编译原理参数传递后对c++和Java按引用传递的不同表现产生疑问,在网上搜索找到的博文,这里提...
  • lqadam
  • lqadam
  • 2016年12月14日 13:38
  • 252

C++中引用传递与指针传递区别(进一步整理)

从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是一个别名,它在逻辑上不是独立的,它的存...
  • xihagod
  • xihagod
  • 2012年08月30日 16:43
  • 265

c++中函数参数传递(值传递、指针传递,引用传递)进一步认识

【重点】:转自@richerg85,请有帮助的朋友一定去原作者处点赞,地址:http://blog.csdn.net/richerg85/article/details/14450183 从函数...

进一步了解const指针

问题 今天群里有人发了个问题,问题如下: 第一个赋值可以,为什么第二个不行 int * x = NULL; int const * y = NULL; y = x; int ** z = ...

SI 及EPG 的进一步理解.pdf

  • 2014年03月19日 16:07
  • 296KB
  • 下载

C++编程思想,进一步理解c++

  • 2011年01月31日 14:05
  • 10.72MB
  • 下载

Java中final的进一步理解

Java中final的进一步理解。final修饰符的作用在JMM中要求final域(属性)的初始化动作必须在构造方法return之前完成。匿名内部类使用外部变量,这个变量必须用final来声明才可以被...

进一步理解mapreduce

  • 2012年07月24日 23:42
  • 1.9MB
  • 下载

深入理解C指针

  • 2017年06月02日 18:14
  • 2.86MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对指针的进一步理解
举报原因:
原因补充:

(最多只允许输入30个字)