指针作为函数的形参的总结

原创 2013年12月05日 23:22:48

      本文是在编程过程中遇到的实际问题,作为总结。参考文档:http://blog.csdn.net/gexueyuan/article/details/9077679

       一般用指针做函数形参是为了传入参数地址,来进行修改实参数的值,即指针指向的值。但是如果要用来修改指针本身的值则需要指针的指针或者指针变量的传址引用。

      先来看一段经典的代码:

    void GetMemory1( char *p )  
    {  
        p = (char *) malloc( 100 );  
    }  
      
    void Test( void )  
    {  
        char *str = NULL;  
        GetMemory1( str );  
        strcpy( str, "hello world" );  
        printf( str );  
    }  

        显然你会发现,经过指针变量通过函数Getmemory后,还是null,并没有分配内存,所以编译运行会出错,或者直接编译报错。原因在于,函数参数传递的时候,直接传递是值传递,需要引用传递需要加上‘&’,作为值传递,p=str,也就是说,p指向的地址和str指向的地址是相同的,同为指向null,但是在函数中局部变量p又重新分配了100个字节的变量,他的值发生变化,指向了别的地址,但是str并没有变化,所以函数对str是无效的。

       究其根本原因,在于p指针的地址和str指针的地址不一样,两者只是共同指向同一个地方(p先指向str指向的地方,后又指向一块内存,然后在函数结束后内存收回)。


       要实现指针作为函数形参,改变实参的值。一般有两种做法:

1.使用双指针,或者指针数组形式作为形参,将实参的地址传入函数。

    void GetMemory2(char **p, int num)   
    {   
        *p = (char *)malloc(sizeof(char) * num);   
        if ( *p == NULL )  
        {  
         printf("Malloc error!\n");
        }   
    }   
    void Test(void)  
    {   
        char *str=NULL;   
        GetMemory2(&str, 100);   
        strcpy(str,"hello world");   
        printf(str);   
        free( str );   
    }  

GetMemory2函数还可以使用数组指针进行传值,如GetMemory2(char* p[], int num);


2. 函数直接返回分配好内存的地址。

    char *GetMemory3()  
    {   
         char *p=(char *)malloc(100);   
         if ( *p == NULL )  
         {  
             printf("Malloc error!\n");  
               return NULL;
          }  
          return p;   
    }   
    void Test(void)
    {   
        char *str=NULL;   
        str=GetMemory3();  
        strcpy(str,"hello world");   
        printf(str);   
        free( str );   
    }  
       该方法使用一个指针函数,返回一个指向分配好内存的地址,返回的是一个值(p指向的地址,一个int变量(处理器位数决定)),是能够返回的,如果返回的是指向局部变量的指针,那么会发生程序错误。指针做函数返回值,指向的值在函数结束后不能够被注销,否则发生程序错误(返回时并没有错,使用的时候已经变成未知的值,可能造成系统紊乱)。




相关文章推荐

指针变量作为函数参数

先描述一个题目,题目是这样的,输入a和b两个整数,按先大后小的顺序输出a和b。` /* Note:Your choice is C IDE */ #include "stdio.h" void mai...

指针作为函数参数传递 (转载)

这几天在学习C过程中,在使用指针作为函数参数传递的时候出现了问题,根本不知道从何得解:源代码如下:     createNode(BinNode *tree,char *p)     {    ...
  • lpp1989
  • lpp1989
  • 2012年07月20日 13:57
  • 15431

指针作为函数形参的思考

最近在论坛上看到有一篇帖子提问下面的问题: char * fun(char *p){       return p;}提问:此函数返回的是谁的值,是参数p的地址,还是p的值? 回答:p的值,但其值指向...

函数中的形参问题(指针形参、引用形参、二重指针作为形参)

(1)用指针传递参数,可以实现对实参进行改变的目的,是因为传递过来的是实参的地址,因此使用*a实际上是取存储实参的内存单元里的数据,即是对实参进行改变,因此可以达到目的。在使用的过程中需要通过对地址的...

指向函数的指针作为参数时的使用方法

谭教授说,指向函数的指针作为参数是C语言实际应用中的一个比较深入的部分,那就等以后用到了,做个参考吧。#include void min(int a,int b); void max(int a,...

函数指针作为某个函数的参数及定义函数指针

一、 定义某一函数的指针类型: 就像自定义数据类型一样,我们也可以先定义一个函数指针类型,然后再用这个类型来申明函数指针变量。 我先给你一个自定义数据类型的例子。 typedef int* PI...
  • vlily
  • vlily
  • 2012年02月09日 10:54
  • 34437

c++之指针作为函数参数传递的问题

  原创文章,转载请注明出处,谢谢! 作者:清林,博客名:飞空静渡 博客地址:http://blog.csdn.net/fjb2080 其实,对于C或者C++,最难的一块地方估计就是指针了。指针...
  • fjb2080
  • fjb2080
  • 2010年05月25日 17:44
  • 19428

C语言指针作为形参的一些问题

指针作为形参肯定有很多都不清楚其中具体的原理,我也是最近摸清了些门道: 下面就用一些例子来给大家说明: void myMalloc(char *s) //我想在函数中分配内存,再返回 { ...

C语言函数传递指针参数的问题

一个问题是,当我们想用一个指针作为形参以此来对指针所指的对象进行一些操作的时候,我们应该怎么做?这种问题其实是很常见的一个问题,比如在结构体或者结构体数组中,直接传递一个结构体数组相比于传递一个指向结...

函数的形参(普通形参、指针形参、引用形参)

int n=10; add1(n); 1、普通形参 void add1(int v1) { v1+=1;/对实参无影响 } 这是最普通的形参方式,形参仅仅为实参的一个副本,对形参的任...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指针作为函数的形参的总结
举报原因:
原因补充:

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