Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1323736
  • 博文数量: 168
  • 博客积分: 2124
  • 博客等级: 大尉
  • 技术积分: 2590
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-16 23:51
文章分类

全部博文(168)

文章存档

2014年(6)

2013年(74)

2012年(71)

2011年(17)

分类: LINUX

2013-08-06 12:17:12

说这话其实很牵强,更广泛的标题应该是《函数内修改变量的方法》,因为指针也是变量的一种嘛。但是我是在操作指针遇到的这个问题,遂还是以问题为标题。


开门见山:

1.以返回值返回
2.修改指针的地址
3.结构体内的指针的特殊性。


以一个简单的例子来说:


一.首先看它的错误实现

点击(此处)折叠或打开

  1. #include<stdio.h>

  2. void test(char *dst, char *src)
  3. {
  4.     dst = src;
  5. }

  6. int main(int argc, char **argv)
  7. {
  8.     char *src = "hello world";
  9.     char *dst = NULL;
  10.     test(dst, src);
  11.     
  12.     printf("dst = %s", dst);
  13.     while(1);
  14. }

答案输出是 NULL,实际在test函数体里观察变量,会发现在函数体力dst实际已经指向了“hello world”

但是c语言是传值操作,dst,和src传进去的都是变量的副本。

二.用return来实现


点击(此处)折叠或打开

  1. #include<stdio.h>

  2. char* test(char *dst, char *src)
  3. {
  4.     
  5.     return dst = src;

  6. }

  7. int main(int argc, char **argv)
  8. {
  9.     char *src = "hello world";
  10.     char *dst = NULL;
  11.     
  12.     dst = test(dst, src);
  13.     
  14.     printf("dst = %s", dst);
  15.     while(1);
  16. }

发现得到的是正确答案,不多解释。

三.不用返回值,修改指针指向的位置


点击(此处)折叠或打开

  1. #include<stdio.h>

  2. void* test(char **dst, char *src)
  3. {
  4.     
  5.     return *dst = src;

  6. }

  7. int main(int argc, char **argv)
  8. {
  9.     char *src = "hello world";
  10.     char *dst = NULL;
  11.     
  12.     test(&dst, src);
  13.     
  14.     printf("dst = %s", dst);
  15.     while(1);
  16. }

  1. void* test(char **dst, char *src)
                test(&dst, src);
            传进去的实际上是指向dst这个指针变量的指针,即指针的指针,修噶爱*dst,即相当于修改指针指向的位置(突然发现这里调用函数和被调用函数名字一样很不好解释。)
            通过指向指针的指针**P,修改指针*p,这里传进来的副本是**p,在怎么修改**p在函数体外都不变。修改**p的值,即修改内存中*p的值,从而得到想要的结果。



               其实说到头来,我们都可以用最早学习的例子swap的原理来说明。 
        
四.结构体内指针的特殊性


如果我们想改变结构体中某个变量,需要传递一个指向该结构体的指针!
这样,不管你想改变的是结构体中的成员是一个普通变量还是一个指针,都是可以改变的,因为通过该结构体指针,
可以获得该结构体(也是该结构体中第一个成员)的地址,进而也就知道了结构体中任一成员的地址
因此对于结构体内容,想怎么改变就怎么改变!

所以说特殊,一点也不特殊。

参考
http://blog.csdn.net/laojing123/article/details/6544275










阅读(2249) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~