对指针的进一步理解

原创 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' 位置上,成功实现了字符串连接。


















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

谈一下我对于指针的理解

--------------------转载请注明源地址: 对于指针,我是纠结了很久,很长一段时间都没有弄懂,指针到底是个什么玩意。查了不少资料:算是对于指针有了点理解,就写下来把; 在内存中,每一个...
  • u013082522
  • u013082522
  • 2014年03月02日 00:52
  • 2050

指针的进一步理解

#include "stdafx.h"typedef struct  list{ int *elem; int len;}Sqlist;int _tmain(int argc, _TCHAR* arg...
  • houailu
  • houailu
  • 2010年04月02日 10:44
  • 146

ADT(抽象数据类型)的理解

比如对于栈这种数据结构,无论是顺序表的实现方式,还是基于链表的实现方式,两个类,除了类名不同之外,完全可以相互替代。...
  • lanchunhui
  • lanchunhui
  • 2016年08月01日 11:51
  • 465

如何理解指向指针的指针?

问题:如何理解指向指针的指针? 我在一篇教程中看到下面这段,它描述指向指针的指针是如何运作的。 引用文章相关段落如下: int i = 5, j = 6, k = 7; int *ip1 = &...
  • jb19900111
  • jb19900111
  • 2014年03月04日 11:00
  • 1355

指针学习的进一步理解

首先分析下面这个程序: #include int *test() { int i =5 , * pi = &i ; return pi ; } void main () { int * pj...
  • a317281242
  • a317281242
  • 2013年08月19日 16:25
  • 462

对内存机制进一步理解

说真的,学到最后很容易把一些前面java基础原理给忘了,其实那些东西很重要都是平时没注意的,特别是java内存机制,java中有两个内存,栈内存和堆内存,栈内存是临时的,随时释放,这样的数据一定要考虑...
  • michaeltang123
  • michaeltang123
  • 2012年06月02日 17:22
  • 195

C 指针的理解

推荐对C语言有一定理解的程序员阅读。 如何理解指针就是地址。 1. 内存长成啥样? 2. 什么是地址? 3. 为什么说指针就是地址?...
  • shijichao2
  • shijichao2
  • 2015年11月04日 23:11
  • 714

对面向对象的进一步理解

大概在一个多月之前,我写过一篇同样的关于我对面向对象的理解,当时是用c语言写的一个代码片段,一个没有实现任何功能的只是为了解释面向对象的理解的一个代码片段 大致是如此的一个代码片段:  typed...
  • fyping_1
  • fyping_1
  • 2016年12月04日 13:42
  • 104

Restful 理解

前几年一直都是关注在android相关的app,最近接触到了APP+web服务器,发现目前web服务器都是采用Restful api的编写形式,对于Restful api并没有很深的了解,所以就搜搜看...
  • fengxinziyangyang
  • fengxinziyangyang
  • 2016年05月20日 09:21
  • 545

深入理解C指针学习笔记(一)

第一章 认识指针 指针在C和C++中随处可见,它给程序员带来了极大的方便,指针为动态内存的分配提供了重要支持。使用指针我们可以方便的操控内存,提高程序的运行效率;同时利用指针变量我们可以实现各种数...
  • u014630623
  • u014630623
  • 2016年03月21日 21:52
  • 661
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对指针的进一步理解
举报原因:
原因补充:

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