函数的指针参数传出时遇到的问题
2015-07-10 14:59
267 查看
一般而言,函数传出值是没有什么问题的,
一般是这样
要将值传出来,用指针;
要将指针传出来,用二级指针;
最明显的错误是下面的
『
关于栈的问题 之前这篇写过
/article/7829044.html
』
压栈角度将,只是将c和d的值压入了栈中a和b的位置,所以a和b的值怎么变,与c和d没有关系。
如果这样
还是从压栈角度讲,是将b的地址压入栈b的位置,在test中是对b栈保存的地址操作,也就是会跳转到对b的操作。
继续
这个还是通过地址来改变值。
继续
本意是想让d也是输出“ABC”,但是事与愿违,
算然传进来的都是地址,但是这个地址是字符产的地址,而要修改d输出的值就要掺入指针d的地址,也就是二级指针才可以。
正确应为
继续
本意是想将t中的内容输出,也确实将t的地址放到了d中,然而d输出的却是乱码,这个问题是因为t这个地址存放的位置不对,在函数test有效时,变量的开辟存储都是在栈中完成的,一旦函数结束,栈也就被回收,那么t的地址就无效了,虽然那个地址上还保留原始数据,但是操作系统不允许访问。
解决这个问题,在于改变t的位置,在堆中申请,用malloc或者new
如下
现在看见一道题目
其中
int GetResult(const char *input, char *output)
输入参数:
input 输入的字符串
输出参数(需考虑指针指向的内存区域是否有效):
output 输出的字符串
用指针参数传入作为输出,想要再返回一个地址,好像有问题,
其本质和下面这个代码一样
必然要在函数里,申请堆上一个空间,然后将这空间地址赋值给b,
好像可以,但是在调用这个函数时
d传递的只是一个地址,而不是d本身的地址,这是不是一个bug呢,
如果实在要这么做,那就类型强制转化,下面可以实现
一般返回值是通过return来返回的。所以觉得这个题有点问题。。。
一般是这样
要将值传出来,用指针;
要将指针传出来,用二级指针;
最明显的错误是下面的
『
关于栈的问题 之前这篇写过
/article/7829044.html
』
void test(char a,char b) { b=a; } int main () { char c=‘A’; char d='B'; test(c,d); cout<<b<<endl; return 0; }
压栈角度将,只是将c和d的值压入了栈中a和b的位置,所以a和b的值怎么变,与c和d没有关系。
如果这样
void test(char a,char* b) { *b=a; } int main () { char a='A'; char b='B'; test(a,&b); cout<<b<<endl; return 0; }
还是从压栈角度讲,是将b的地址压入栈b的位置,在test中是对b栈保存的地址操作,也就是会跳转到对b的操作。
继续
void test(char* a,char* b) { *b=*a; } int main () { char e = 'A'; char f = 'B'; char* c=&e; char* d=&f; test(c,d); cout<<c<<endl; cout<<d<<endl; return 0; }
这个还是通过地址来改变值。
继续
void test(char* a,char* b) { b=a; } int main () { //char e = 'A'; //char f = 'B'; char* c="ABC"; char* d="CDE"; test(c,d); cout<<c<<endl; cout<<d<<endl; return 0; }
本意是想让d也是输出“ABC”,但是事与愿违,
算然传进来的都是地址,但是这个地址是字符产的地址,而要修改d输出的值就要掺入指针d的地址,也就是二级指针才可以。
正确应为
void test(char* a,char** b) { *b=a; } int main () { //char e = 'A'; //char f = 'B'; char* c="ABC"; char* d="CDE"; test(c,&d); cout<<c<<endl; cout<<d<<endl; return 0; }
继续
void test(char* a,char** b) { char t[]="ABC"; *b=t; } int main () { //char e = 'A'; //char f = 'B'; char* c="ABC"; char* d="CDE"; test(c,&d); cout<<c<<endl; cout<<d<<endl; return 0; }
本意是想将t中的内容输出,也确实将t的地址放到了d中,然而d输出的却是乱码,这个问题是因为t这个地址存放的位置不对,在函数test有效时,变量的开辟存储都是在栈中完成的,一旦函数结束,栈也就被回收,那么t的地址就无效了,虽然那个地址上还保留原始数据,但是操作系统不允许访问。
解决这个问题,在于改变t的位置,在堆中申请,用malloc或者new
如下
void test(char* a,char** b) { char* t=new char (3); t="ABC"; *b=t; } int main () { //char e = 'A'; //char f = 'B'; char* c="ABC"; char* d="CDE"; test(c,&d); cout<<c<<endl; cout<<d<<endl; return 0; }
现在看见一道题目
题目标题: 删除重复字符 给定一个字符串,将字符串中所有和前面重复多余的字符删除,其余字符保留,输出处理后的字符串。需要保证字符出现的先后顺序,并且区分大小写。 详细描述: 接口说明 原型: int GetResult(const char *input, char *output) 输入参数: input 输入的字符串 输出参数(需考虑指针指向的内存区域是否有效): output 输出的字符串 返回值: 0 成功 -1 失败及异常 举例: 输入: abadcbad,那么该单词中红色部分的字符在前面已经出现过。 则:输出abdc,返回0。 知识点: 工程环境请使用VS2005 题目来源: 软件训练营 维护人: d00191780 练习阶段: 初级
其中
int GetResult(const char *input, char *output)
输入参数:
input 输入的字符串
输出参数(需考虑指针指向的内存区域是否有效):
output 输出的字符串
用指针参数传入作为输出,想要再返回一个地址,好像有问题,
其本质和下面这个代码一样
void test(char* a,char* b) { char* t=new char (3); t="ABC"; b=t; }
必然要在函数里,申请堆上一个空间,然后将这空间地址赋值给b,
好像可以,但是在调用这个函数时
char* c="ABC"; char* d="CDE"; test(c,d);
d传递的只是一个地址,而不是d本身的地址,这是不是一个bug呢,
如果实在要这么做,那就类型强制转化,下面可以实现
void test(char* a,char* b) { char* t=new char (3); t="ABC"; *((char**)b)=t; } int main () { //char e = 'A'; //char f = 'B'; char* c="ABC"; char* d="CDE"; test(c,(char*)(&d)); cout<<c<<endl; cout<<d<<endl; return 0; }
一般返回值是通过return来返回的。所以觉得这个题有点问题。。。
相关文章推荐
- Apache服务器的404页面的设置
- shell入门之expr的使用
- WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?
- WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇)
- 一世12年龄在泥土还在打,硅谷00创业毕竟开始播放!
- shell入门之expr的使用 分类: 学习笔记 linux ubuntu 2015-07-10 14:59 76人阅读 评论(1) 收藏
- LeetCode---(58)Length of Last Word
- CSS3 3D transform变换
- AFNetworking、MKNetworkKit和ASIHTTPRequest对比
- android的四种加载模式
- java按指定编码写入和读取文件内容的类
- SQL语句实现模糊查询
- LintCode UniquePathsII 不同的路径II
- 使用Quick-Cocos2d-x开发植物大战僵尸02-地图编辑
- mongodb进阶三之mongodb管理
- WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(上篇)
- WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
- Python学习笔记三:函数
- Codeforces Beta Round #96 (Div. 1) C. Logo Turtle (DP)
- 正则表达式基本语法