| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 955 人关注过本帖
标题:返回指针与返回指针的指针与临时变量全局变量的一点看法!
只看楼主 加入收藏
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
收藏
 问题点数:0 回复次数:9 
返回指针与返回指针的指针与临时变量全局变量的一点看法!
大家好!
在我写程序的时候,遇到了一个问题,通过此问题
我总结出一个小的不值得一提的结论!赶紧写下来与
大家分享!
由于我的C++也比较臭!请各位不要嘲笑我!

1:返回指针时,返回临时指针合法!当然全局亦合法!
2:返回指针的指针时,返回全局指针的指针合法!
返回临时指针的指针非法!
第一个经常遇到我就不多说拉!
第二个我从我的一个程序说起:

#include<iostream>
#include<conio.h>
#include<cstdio>
using namespace std;
char* PArr[10]={0}; //这里标记为A行
char* _inPutArr(char Arr[],int len);
char ** inPutArr(char Arr[][30],int LLen=10,int RLen=30);
void outPut(char **PP,int LLen);

void main()
{
char Array[10][30]={0}; //char* Array[30]={0}
int LLen=10,RLen=30;
cout<<"请输入10个任意字符串:"<<endl<<" 注意暂定它们长度不超过30"<<endl;
char**PP=NULL;
PP=inPutArr(Array);
outPut( PP, LLen );
}


char* _inPutArr(char Arr[],int len)
{ //将用户输入的一个字符装串装入Arr数组
char CH; CH=getchar();
char BLANK=' '; char ENTER='\n';
int count=0;
while(CH!=BLANK&&CH!=ENTER)
{
Arr[count]=CH; //put-Arr
++count;
CH=getchar();
if(count==(len-1)) break; //char数组默认有'\0'结尾!
}
return Arr;
}

char ** inPutArr(char Arr[][30],int LLen,int RLen)
{//将用户输入的十个字符串装入10个数组
//空了一行,这里标记为B行
for( int i=0;i<LLen;++i)
{
PArr[i]=_inPutArr(Arr[i],RLen);
}
return PArr;
}
void outPut(char **PP,int LLen )
{
for(int i=0;i<LLen;++i)
cout<<i<<" 行"<<PP[i]<<endl;
}
如果剪切A行到B行,
就会警告不能返回局部指针变量!
搜索更多相关主题的帖子: 指针 变量 全局 看法 
2007-03-13 10:27
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
可以把你说的第一个,解释一下吗?
第二个我知道,第一个,我不知道了

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-03-13 13:47
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
收藏
得分:0 

char* _inPutArr(char Arr[],int len)
{ //将用户输入的一个字符装串装入Arr数组
char CH; CH=getchar();
char BLANK=' '; char ENTER='\n';
int count=0;
while(CH!=BLANK&&CH!=ENTER)
{
Arr[count]=CH; //put-Arr
++count;
CH=getchar();
if(count==(len-1)) break; //char数组默认有'\0'结尾!
}
return Arr; //这里可以改为char *P=Arr;return P;就可以证明我说的第一点!
}
2007-03-13 18:37
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
收藏
得分:0 
不好意思:
我用的是firefox浏览器!
所以我使用的文字样式!发布后,就自动的去掉了!
我想请你看的是上面的这一句话!
return Arr; //这里可以改为char *P=Arr;return P;就可以证明我说的第一点!
2007-03-13 18:40
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
。。
就记住 无论什么返回都是值传递
只不过角度不同

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-03-13 22:43
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
lz,你在3楼和1楼说的话并不是讲的一种情况。
如果都按3楼说的那种情况的话,那么**也可以合法返回2级指针。
举例:
char ** inPutArr(char Arr[][30],int LLen,int RLen)
{
char **PArr=new char*[10];
for( int i=0;i<LLen;++i)
{
PArr[i]=_inPutArr(Arr[i],RLen);
}
return PArr;
}
这里却是合法的哦

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-03-13 23:54
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
收藏
得分:0 
谢谢: wfpb:
那问题可能是出在了:
char ** inPutArr(char Arr[][30],int LLen,int RLen)
{
char* PArr[10]={0}; //你写成:char **PArr=new char*[10];
for( int i=0;i<LLen;++i)
{
PArr[i]=Arr[i]; //你去掉此句;
PArr[i]=_inPutArr(Arr[i],RLen);
}
return PArr; //原来失败返回,现在成功!
}
问题就出在了:char **PArr=new char*[10];
char* PArr[10]={0};
此两句话上!
我觉得你没有必要使用New,(你忘了delete!);
我想你使用了new存在可能速度降低问题,以及要处理内存问题,
还有附带了异常等问题处理:
当然:
你是高手了,不知道我考虑的对不对!我仅仅是死记住了一些
教条,没编程经验!以后还望你经常指点!谢谢你!
2007-03-14 11:18
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

lz,我不是高手。

我没有delete是因为,如果我delete,那么返回的就是无意义的东西了,要delete就只能是把返回的指针所指的那块内存delete.
其次,我只是说明,你用来证明:


1:返回指针时,返回临时指针合法!当然全局亦合法!
2:返回指针的指针时,返回全局指针的指针合法!
返回临时指针的指针非法!

的函数,是不对的。


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-03-14 12:22
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
收藏
得分:0 
既然你不
想用delete,那么你我觉得你给出的例子!
不可用!
谢谢!

2007-03-14 14:35
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

在函数外部释放内部申请的内存
这种情况还是很常见的

[此贴子已经被作者于2007-3-20 23:08:38编辑过]


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-03-20 23:07
快速回复:返回指针与返回指针的指针与临时变量全局变量的一点看法!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036251 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved