函数返回什么类型好:指针还是c 对象函数指针

C++ 中函数返回值如果跟类相关的话,一般是直接返回类还是返回类的指针?-学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
> 信息中心 >
C++ 中函数返回值如果跟类相关的话,一般是直接返回类还是返回类的指针?
来源:互联网 发表时间: 10:54:51 责任编辑:李志喜字体:
为了帮助网友解决“C++ 中函数返回值如果跟类相关的话,一般是直接返回类还是返回类的指针?”相关的问题,学网通过互联网对“C++ 中函数返回值如果跟类相关的话,一般是直接返回类还是返回类的指针?”相关的解决方案进行了整理,用户详细问题包括:
如题:C++ 中函数返回值如果跟类相关的话,一般是直接俯恭碘枷鄢磺碉委冬莲返回类还是返回类的指针?挺好奇返回这两者之间的区别的
,具体解决方案如下:解决方案1:返回类的指针会有生命期的问题。我认为常见情况是直接返回对象
1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 学网 版权所有
京ICP备号-1 京公网安备02号9446人阅读
C的往事(38)
1.先看程序:#include&stdio.h&char& *returnStr(){&&&&&&&&&& char& *p = “tigerjibo”;&&&&&&&&&& return&}int& main(){&&&&&&&&&& char*&&&&&&&&&& str =returnStr();&& //str[0]=’T’;则会引起错误,不能修改只读数据段中的内容&&&&&&&&&& printf(“%s\n”,str);&&&&&&&&&& return0;}来分析下该程序。(1)char& *p = “tigerjibo”。系统在栈上分配四个字节的空间存放p的数值。“tigerjibo”是字符常量,存放在只读数据段内。指向完后,系统把”tigerjibo”的地址赋值给p。(2)函数用return 把p的数值返回。该数值指向只读数据段(该数据段内的数据是静态的不会改变)。退出子函数后,系统把p的数值销毁。但是p的数值已经通过return 返回。且只读数据段中的内容不会被修改和回收(其输于静态区域)(3)在主程序中把该地址又给了str。因此str指向了“tigerjbo”。(4)该程序虽然能运行,担又一个缺点,就是在程序中不能修改字符常常量中的数值。如果修改会引起段错误。2.先看程序#include&stdio.h&char&*returnStr(){&&&&&&&&&& char& p[]=”tigerjibo”;&&&&&&&&&& return&}int& main(){&&&&&&&&&& char& *&&&&&&&&&& str =returStr();&&&&&&&&&& printf(“%s\n”,str);}编译该程序后,系统会提示如下警告:function&returns& address of local variable(函数返回一个可变地址)分析该错误:1&”tigerjibo”是一个字符常量,存放在只读数据段中,是不能被修改的。2&char p[],是一个局部变量,当函数被调用时,在栈上开辟一个空间来存放数组P的内容。3&char p[]=”tigerjibo”,该语句是把”tigerjibo”的值赋值给数值P,存放在数组p地址处。而不是把”tigerjibo”的地址赋值给数组p。因此,“tigerjibo”此时在系统中有一处备份,一个在只读数据段中(不能修改,内容也不会被回收),一个在栈上存储(可以修改起内容,但函数退出后,其栈上存储的内容也会被回收)。4&因此,当return p,返回了数组的首地址,但是当函数退出后,其栈上的内容也将被丢弃,局部变量的内存也被清空了,因此该数组首地址处的内容是一个可变的值。3.先看一个程序:#include&stdio.h&char&*returnStr(){&&&&&&&&&& static& char p[]=”tigerjibo”;&&&&&&&&&& return&}int& main(){&&&&&&&&&& char& *&&&&&&&&&& str =returnStr();&&&&&&&&&& str[0]=’T’;&&&&&&&&&& printf(“%s\n”,str);}此程序运行正确。分析如下:1&”tigerjibo”是一个字符常量,存放在只读数据段中,是不能被修改的。2&static char p[],是一个静态局部变量,在读写数据段中开辟一个空间给p用来存放其数值。3&static char p[]=”tigerjibo”,该语句是把”tigerjibo”的值赋值给数值P,存放在数组p地址处。而不是把”tigerjibo”的地址赋值给数组p。因此,“tigerjibo”此时在系统中有一处备份,一个在只读数据段中(不能修改,内容也不会被回收),一个在读写数据段中存储(可以修改其内容,当函数退出后,因其在读写数据段中存储,起内容不会被丢弃)。4&因此,当return p,返回了数组的首地址,但是当函数退出后,虽然栈上的内容都清除了,但是p地址是读写数据段中的地址,其上的内容不会被回收。4.先看一个程序:#include&stdio.h&#include&string.h&#include&strdlib.h&void&getmemory(char *p){&&&&& & p = (char *)malloc(100);}int& main(){&&&&& char& *str=NULL;&&&&& getmemory(str);&&&&& strcpy(str,”helloworld”);&&&&& printf(“%s\n”,str);}编译后错误:段错误分析:在主程序中,str地址为空。在函数传递中将str的地址传给了子函数中的指针p(是拷贝了一份),然后在字函数中给p在堆上申请了一个100字节的空间,并把首地址赋值给p。但是函数传递中,p值改变不会影响到主函数中str的值。因此,str的地址仍为空。在strcpy中引用空指针会出现段错误。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1339185次
积分:13850
积分:13850
排名:第677名
原创:176篇
转载:40篇
评论:640条
阅读:65950
文章:20篇
阅读:125607
(1)(6)(5)(3)(9)(6)(3)(1)(3)(8)(1)(2)(12)(5)(4)(7)(4)(8)(3)(1)(8)(12)(14)(1)(5)(17)(1)(10)(7)(16)(11)(22)
jquery学习网址
/zt/jquery/
XML学习网址博客访问: 138912
博文数量: 32
博客积分: 836
博客等级: 军士长
技术积分: 294
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
一、函数指针
首先它是一个指针,只是这个指针指向的是一个函数。指针变量可以指向变量的地址、数组、字符串、动态分配地址,同时也可指向一个函数,每个函数在编译的时候,系统会分配给该函数一个入口地址,函数名表示这个入口地址,那么指向函数的指针变量称为函数指针变量。
struct file_operations {
int (*seek) (struct inode * ,struct file
*, off_t ,int);
int (*read) (struct inode * ,struct file
*, char ,int);
int (*write) (struct inode * ,struct file
*, off_t ,int);
int (*readdir) (struct inode * ,struct file
*, struct dirent * ,int);
int (*select) (struct inode * ,struct file
*, int ,select_table *);
int (*ioctl) (struct inode * ,struct file
*, unsined int ,unsigned long);
int (*mmap) (struct inode * ,struct file
*, struct vm_area_struct *);
int (*open) (struct inode * ,struct file
int (*release) (struct inode * ,struct file
int (*fsync) (struct inode * ,struct file
int (*fasync) (struct inode * ,struct file
int (*check_media_change) (struct inode * ,struct file
int (*revalidate) (dev_t dev);
上面这个结构体file_operations里面的组件都是函数指针:int (*read) (struct inode * ,struct file *, char ,int);注意int (*read)是加上括号的。
二、指针函数
首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
float *fun();
p = fun(a);
注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。
来讲详细一些吧!请看下面
一、指针函数
&&& 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。
&&& 格式:
类型说明符 * 函数名(参数)
&&& 当然了,由于返回的是一个地址,所以类型说明符一般都是int。
&&& 例如:int
*GetDate();
int * aaa(int,int);
&&& 函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。
int * GetDate(int wk,int dy);
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&&& printf(Enter
week(1-5)day(1-7)\n);
&&&&&&&&&&&&&&& scanf(%d%d,&wk,&dy);
&&&&&&&&&&&
&&&&&&&&&&&
while(wk5||dy7);
&&&&&&&&&&&
printf(%d\n,*GetDate(wk,dy));
int * GetDate(int wk,int dy)
&&&&&&&&&&&
static int calendar[5][7]=
&&&&&&&&&&&
&&&&&&&&&&&&&& {1,2,3,4,5,6,7},
&&&&&&&&&&&&&& {8,9,10,11,12,13,14},
&&&&&&&&&&&&&& {15,16,17,18,19,20,21},
&&&&&&&&&&&&&& {22,23,24,25,26,27,28},
&&&&&&{29,30,31,-1}
&&&&&&&&&&&
&&&&&&&&&&&
return &calendar[wk-1][dy-1];
程序应该是很好理解的,子函数返回的是数组某元素的地址。输出的是这个地址里的值。
二、函数指针
&&& 指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:
类型说明符 (*函数名)(参数)
&&& 其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明笔削和它指向函数的声明保持一致。
指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。
&&& 例如:
void (*fptr)();
&&& 把函数的地址赋值给函数指针,可以采用下面两种形式:
&&& 取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
&&& 可以采用如下两种方式来通过指针调用函数:
x=(*fptr)();
&&& 第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。下面举一个例子:
void (*funcp)();
void FileFunc(),EditFunc();
&&&&&&&&&&&
funcp=FileF
&&&&&&&&&&&
(*funcp)();
&&&&&&&&&&&
funcp=EditF
&&&&&&&&&&&
(*funcp)();
void FileFunc()
&&&&&&&&&&&
printf(FileFunc\n);
void EditFunc()
&&&&&&&&&&&
printf(EditFunc\n);
程序输出为:
&&&&&&&&&&&
&&&&&&&&&&&
三、指针的指针
&&& 指针的指针看上去有些令人费解。它们的声明有两个星号。例如:
&&& 如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针,依次类推。当你熟悉了简单的例子以后,就可以应付复杂的情况了。当然,实际程序中,一般也只用到二级指针,三个星号不常见,更别说四个星号了。
&&& 指针的指针需要用到指针的地址。
char c='A';
char *p=&c;
char **cp=&p;
&&& 通过指针的指针,不仅可以访问它指向的指针,还可以访问它指向的指针所指向的数据。下面就是几个这样的例子:
char *p1=*
char c1=**
&&& 你可能想知道这样的结构有什么用。利用指针的指针可以允许被调用函数修改局部指针变量和处理指针数组。
void FindCredit(int **);
&&&&&&&&&&&
int vals[]={7,6,5,-4,3,2,1,0};
&&&&&&&&&&&
&&&&&&&&&&&
FindCredit(&fp);
&&&printf(%d\n,*fp);
void FindCredit(int ** fpp)
&&&&&&&&&&&
while(**fpp!=0)
&&&&&&&&&&&
if(**fpp<0)
&&&&&&&&&&&
else (*fpp)++;
&&& 首先用一个数组的地址初始化指针fp,然后把该指针的地址作为实参传递给函数FindCredit()。FindCredit()函数通过表达式**fpp间接地得到数组中的数据。为遍历数组以找到一个负值,FindCredit()函数进行自增运算的对象是调用者的指向数组的指针,而不是它自己的指向调用者指针的指针。语句(*fpp)++就是对形参指针指向的指针进行自增运算的。但是因为*运算符高于++运算符,所以圆括号在这里是必须的,如果没有圆括号,那么++运算符将作用于二重指针fpp上。
四、指向指针数组的指针
&&& 指针的指针另一用法旧处理指针数组。有些程序员喜欢用指针数组来代替多维数组,一个常见的用法就是处理字符串。
char *Names[]=
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&&&&&&&&
char **nm=N
&&&&&&&&&&&
while(*nm!=0) printf(%s\n,*nm++);
&&& 先用字符型指针数组Names的地址来初始化指针nm。每次printf()的调用都首先传递指针nm指向的字符型指针,然后对nm进行自增运算使其指向数组的下一个元素(还是指针)。注意完成上述认为的语法为*nm++,它首先取得指针指向的内容,然后使指针自增。
&&& 注意数组中的最后一个元素被初始化为0,while循环以次来判断是否到了数组末尾。具有零值的指针常常被用做循环数组的终止符。程序员称零值指针为空指针(NULL)。采用空指针作为终止符,在树种增删元素时,就不必改动遍历数组的代码,因为此时数组仍然以空指针作为结束。
原文地址:http://yliangliang./.html
阅读(7787) | 评论(0) | 转发(2) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。百度文库-信息提示
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
对不起,该文档已被删除,无法查看
15秒后,自动返回首页}

我要回帖

更多关于 c 对象函数指针 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信