善于指针---使用返回指针值的函数
来源:互联网 发布: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
- 善于指针---使用返回指针值的函数
- 善于指针---使用返回指针值的函数(续)
- 返回指针的函数使用
- 函数指针,指针函数,返回值为指针的函数
- 返回指针值的函数
- 返回指针值的函数
- 返回指针值的 函数
- 返回指针值的函数
- 返回指针值的函数
- 函数的返回值是函数指针的指针函数
- 返回指针的函数
- 返回指针的函数
- 返回函数的指针
- 返回指针的函数
- 返回指针的函数
- 返回指针的函数
- 返回指针的函数
- 返回指针的函数
- 学会Settings必看
- win64上 tortoisesvn的安装和使用
- Wireshark基本介绍和学习TCP三次握手
- 树莓派的.bashrc和.bash_aliases文件
- 浅谈Java中的hashcode方法
- 善于指针---使用返回指针值的函数
- 斐波那契改进
- 水樹 奈々 Blog 20140924 愛溢れる激アツ現場译文
- 数据结构-set
- 验证码
- 视频对讲技术
- P3E
- MASM中3中文本宏的使用与区别
- android 上通过反射,获取存储器列表