善于指针---使用返回指针值的函数

来源:互联网 发布:java.tedu.cn@v 编辑:程序博客网 时间:2024/04/30 14:08

一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。

int  *a(int x,int y);

a是函数名,调用它后能得到一个指向整型数据的指针(地址)。

因为()优先级高于 *,因此a先于()结合。显然这是函数形式,即函数的返回值为int类型的指针。

#include<iostream>#include<cstdio>using namespace std;int *add(int x,int y){int *t=new int (0);*t=x+y;return t;}int main(){int a=3,b=4;int *p=add(a,b);cout<<*p<<endl;delete p;system("pause");return 0;}


 下面说说返回指针值的函数应该注意的问题:

#include<iostream>#include<cstdio>using namespace std;char *GetString(void){ char p[] = "hello world"; return p; }int main(){ char *str = NULL; str = GetString(); //str 的内容是垃圾,得不到想要的内容 cout<<str<<endl; system("pause"); return 0;}


上面在编译时警告使用局部变量或临时变量作为返回值。
上面的程序就不能得到想要的结果,因为在函数GetString()中定义的变量p属于local(局部变量),当函数结束时自动消失,所以在返回时,根本就得不到p所指的内容

怎么解决这个问题呢?

因为局部变量在函数调用结束之后就自动消失,所以不能正确返回想要的结果,解决办法有:

(1)可以使用全局数组。使用全局变量时,在程序结束时才释放。

char p[] = "hello world";char *GetString(void){ return p; }int main(){ char *str = NULL; str = GetString(); //str 的内容是为 'hello world' cout<<str<<endl; system("pause"); return 0;}


2.在函数GetString()中使用new在堆上动态分配内存来建立数组。C语言中可以使用malloc()函数。不过不要忘记了,在使用完后要进行内存的释放,不然会造成内存的泄漏。

char *GetString(void){char *p;p=(char *)malloc(100);    return p; }int main(){ char *str = NULL; str = GetString(); strcpy(str,"hello world"); cout<<str<<endl; free(str); system("pause"); return 0;}


 

3.可以定义为静态类型,static char p[]="hello world"。用static   声明一个指针可以,但也不太好,因为如果你多次调用这个函数返回多个指针,但这几个指针实际上指向同一块地址,改变任何一个的内容将改变所有指针的内容, 这样也不是很多情况所需要的。

char *GetString(){static char p[]="hello world";    return p; //p为静态创建,程序退出时才释放}


一般在函数中定义一个对象有两种方法:  
  1、在栈上建立局部变量。注意,在栈上时!栈用于函数是为了返回时找得到调用点(在调用时压入栈的)
,那么,返回时要POP才能得到。函数体中建立的任何东西都消失了(返回值除外),你返回的指针指向的内
容现在不知被用作什么用途了,如果你还要修改的话,那么后果不能确定。  
  2、在堆中分配。返回时不会摧毁,因为堆是全局存在的。但函数的调用者要记得delete回来的指针。

学习参考:http://blog.chinaunix.net/uid-20788636-id-1841283.html

0 0
原创粉丝点击