您的位置:首页 > 其它

函数的指针参数传出时遇到的问题

2015-07-10 14:59 267 查看
一般而言,函数传出值是没有什么问题的,

一般是这样

要将值传出来,用指针;

要将指针传出来,用二级指针;

最明显的错误是下面的



关于栈的问题 之前这篇写过

/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来返回的。所以觉得这个题有点问题。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: