Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1488104
  • 博文数量: 338
  • 博客积分: 2695
  • 博客等级: 少校
  • 技术积分: 3556
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-05 11:37
个人简介

小鱼儿游啊游啊。。。。

文章分类

全部博文(338)

文章存档

2019年(4)

2018年(8)

2017年(6)

2016年(10)

2015年(49)

2014年(48)

2013年(98)

2012年(115)

分类: LINUX

2013-01-07 14:39:16




swap(int *p1,int *2)
{int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
main()
{int a,b;
int *pointer_1,*pointer_2;
scanf("%d%d",&a,&b);
pointer_1=&a;pointer_2=&b;
if(a printf("%d,%d\n",a,b);
}
进入函数后,函数创建几个空间给形参,再把实参数值拷过来。退出函数时,把形参空间释放,则影响不到实参。这就是值传递。
swap(int *p1,int *p2)函数首先创建两个空间,是指针,再把实参复制过来,即p1=pointer_1=&a,p2=pointer_2=&b,改变p1,p2就分别指向了a,b.改变p1指向的值就是改变了a。然后交换*p1,*p2,ab就互换了。函数退出,释放p1,p2所占的内存空间。但是a,b值互换了。swap函数没有改变实参pointer_1,pointer_2的内容,只是借助指针实现了巧妙的乾坤大挪移。
swap(int *p1,int *p2)也没有改变原来两个实参pointer_1,pointer_2的值,他们值分别是是a,b地址,但pointer_1,2指向的内容改变了,改的是以pointer_1,pointer_2的值为地址的内存单元的值。

*************************************************************
swap(int x,int y)
{int temp;
temp=x;
x=y;
y=temp;
}
main()
{int a,b;
scanf("%d%d",&a,&b);
if(aprintf("%d,%d\n",a,b);
}

swap(int x,int y)没有改变原来实参a,b的值

********************************************************

一、使用指针做函数返回值:

1、当使用指针做为函数的返回值时,主函数处的char *p;将获得调用函数char *pf;的值,即一个地址值,如oxAE72。此时需要我们注意的是该地址值所指向的空间是否存在(即已向操作系统声明注册,不会被释放,即可能被其他操作修改);
2、使用栈内存返回指针是明显错误的,因为栈内存将在调用结束后自动释放,从而主函数使用该地址空间将很危险。
   例如:

            char* GetMemory()
            {
                        char p[] = "hi";
                        return p;
            }
           
            void main()
            {
                        char *str = GetMemory();           //出错! 得到一块已释放的内存
                        printf(str);
            }
 
3、使用堆内存返回指针是正确的,但是注意可能产生内存泄露问题,在使用完毕后主函数中释放该段内存。
   例如:
            char* GetMemory()
            {
                        char *p = new char[100];
                        return p;
            }
 
            void main()
            {
                        char *str = GetMemory();
                        delete [] str;       //防止内存泄露!
            }
 
 二、使用指针做函数参数:
 
1、有的情况下我们可能需要需要在调用函数中分配内存,而在主函数中使用,而针对的指针此时为函数的参数。此时应注意形参与实参的问题,因为在C语言中,形参只是继承了实参的值,是另外一个量(ps:返回值也是同理,传递了一个地址值(指针)或实数值),形参的改变并不能引起实参的改变。
 
2、直接使用形参分配内存的方式显然是错误的,因为实参的值并不会改变,如下则实参一直为NULL:
            void GetMemory(char* p)
            {
                        char *p = new char[100];
            }
 
            void main()
            {
                        char *str;
                        GetMemory(str);
                        strcpy(str, "hi"); //出错! str = NULL!
            }
 
3、由于通过指针是可以传值的,因为此时该指针的地址是在主函数中申请的栈内存,我们通过指针对该栈内存进行操作,从而改变了实参的值。
            void Change(char *p)
            {
                        *p = 'b';
            }
 
            void main()
            {
                        char a = 'a';
                        char* p = &a;
                        Change(p);
                        printf("%c"n", a);           //值a改变!
            }
 
4、根据上述的启发,我们也可以采用指向指针的指针来进行在调用函数中申请,在主函数中应用。如下:假设a的地址为ox23,内容为'a';而str的地址是ox46,内容为ox23;而pstr的地址是ox79,内容为ox46。
   我们通过调用函数GetMemory,从而将pstr的内容赋给了p,此时p = ox46。通过对*p(ox23)的操作,即将内存地址为ox23之中的值改为char[100]的首地址,从而完成了对char* str地址的分配。
            void GetMemory(char** p)
            {
                        char *p = new char[100];
            }
 
            void main()
            {
                        char a = 'a';
                        char* str = &a;
                        char** pstr = &str;
                        GetMemory(pstr);
                        strcpy(str, "hi");
            }
5、注意指针的释放问题,可能形成悬浮指针。
   当我们释放掉一个指针p后,只是告诉操作系统该段内存可以被其他程序使用,而该指针p的地址值(如ox23)仍然存在。如果再次给这块地址赋值是危险的,应该将p指针置为NULL。
   调用函数删除主函数中的内存块时,虽然可以通过地址传递直接删除,但由于无法对该指针赋值(形参不能传值),可能造成悬浮指针,所以此时也应该采用指向指针的指针的形参。例如:
            void MemoryFree(char** p)
            {
                        delete *p;
                        *p = NULL;
            }
            void main()
            {
                        char *str = new char[100];
                        char *pstr = &str;
                        MemoryFree(pstr);        
            }
阅读(4330) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~