免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2411 | 回复: 4
打印 上一主题 下一主题

请问传递给函数的指针在函数内部改变指向会影响函数外的指向么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-18 20:20 |只看该作者 |倒序浏览
学习c语言的时候,自己做练习写了个 strcat() 函数,代码如下,我这里直接把指针传递给函数后,在函数内部改变了指针的指向,
而得到的结果却是正确的,我以为我这么写就是ok的,
结果参考glibc里面 /string/strcat.c 的实现,发现它居然是另外定义了两个指针来分别代替传递进来的数组指针,运算完后,返回原dest的首地址。
glibc的实现肯定是有深意的,那么它为什么要重新定义两个指针来代替原指针做运算呢?为了返回值dest(函数内部的操作不影响外部值?)?或者其他,希望大家能帮我解惑,谢谢。

这个是我写的练习
  1. #include<stdio.h>

  2. #define MAX 100
  3. char *mystrlen(char *s, char *t);

  4. int main()
  5. {
  6.         char s[MAX] ="abcd";
  7.         char *t = "efg";
  8.         mystrlen(s,t);
  9.         printf("%s\n",s);
  10. }

  11. char *mystrlen(char *s, char *t)
  12. {
  13.         for(; *s != '\0'; s++)
  14.                 ;
  15.         while (*s++ = *t++)
  16.                 ;
  17.         return s;
  18. }
复制代码
这个是 glibc中的strcat.c 的实现
  1. #include <string.h>
  2. #include <memcopy.h>

  3. #undef strcat

  4. /* Append SRC on the end of DEST.  */
  5. char *
  6. strcat (dest, src)
  7.      char *dest;
  8.      const char *src;
  9. {
  10.   char *s1 = dest;
  11.   const char *s2 = src;
  12.   reg_char c;

  13.   /* Find the end of the string.  */
  14.   do
  15.     c = *s1++;
  16.   while (c != '\0');

  17.   /* Make S1 point before the next character, so we can increment
  18.      it while memory is read (wins on pipelined cpus).  */
  19.   s1 -= 2;

  20.   do
  21.     {
  22.       c = *s2++;
  23.       *++s1 = c;
  24.     }
  25.   while (c != '\0');

  26.   return dest;
  27. }
  28. libc_hidden_builtin_def (strcat)
复制代码

论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2016-04-15 14:24:43
2 [报告]
发表于 2012-02-18 20:43 |只看该作者
菜鸟说,没有那么深奥吧,就是为了返回首地址的啦,而且感觉下面的代码特别扭啊

论坛徽章:
0
3 [报告]
发表于 2012-02-18 20:49 |只看该作者
本帖最后由 lylesong 于 2012-02-18 20:53 编辑

回复 2# salman_chan


    我也觉得下面的代码写的太啰唆了,
我这里主要想知道的,指针传递给函数后,在函数内部改变了指针的指向,会影响同一个指针在函数外面的指向么?

并且写的还有点怪异

char *strcat (dest, src)

char *dest;
const char *src;
{...}

这里两个全局变量咋个写到那个位置上去了,并且为啥还要在这里定义这个?

论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2016-04-15 14:24:43
4 [报告]
发表于 2012-02-18 21:09 |只看该作者
回复 3# lylesong

肯定是没有影响的吧,只是把地址赋值给形参指针啦
如果要改变函数外部指针的话,就要传指针的指针了
   

论坛徽章:
0
5 [报告]
发表于 2012-02-18 21:40 |只看该作者
回复 4# salman_chan


    哦,谢谢,明白了哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP