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

原创 2015年07月10日 14:59:41

一般而言,函数传出值是没有什么问题的,
一般是这样
要将值传出来,用指针;
要将指针传出来,用二级指针;
最明显的错误是下面的


关于栈的问题 之前这篇写过
http://blog.csdn.net/u010442328/article/details/45823969

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来返回的。所以觉得这个题有点问题。。。

版权声明:本文为博主原创文章,未经博主允许不得转载。

C语言中“指针”作为“函数参数”时的注意事项

C语言中“指针”作为“函数参数”时的注意事项
  • dan15188387481
  • dan15188387481
  • 2015年10月23日 16:58
  • 4941

如何正确使用指针(指针作为输出型参数)与结构体指针作为函数参数

如何正确使用指针(指针作为输出型参数)与结构体指针作为函数参数 外部定义一个结构体类型指针变量,使用##结构体指针里面的内嵌指针,返回值,双重指针##方式进行地址传递...
  • TongxinV
  • TongxinV
  • 2017年02月10日 15:12
  • 1968

双重指针做函数参数的意义

一. 回顾指针概念: 今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧! 当我们程序如下申明变量: short int i; char a; short...
  • u013656962
  • u013656962
  • 2015年12月29日 14:24
  • 1372

函数参数用指针或引用传递时发现的一个小问题

今天看php手册时,看到引用那一章节时,有这么一段代码: $baz = "hello world!"; function foo (&$var) { $var =& $GLOBALS["...
  • huanyingxidian
  • huanyingxidian
  • 2013年06月02日 19:50
  • 401

指针变量作为函数参数使用时注意的问题!

#include int main() { void swap(int *p1, int *p2); int a, b; int *pointer1, *pointer2; printf("plea...
  • Rueing839
  • Rueing839
  • 2015年09月07日 11:23
  • 387

函数参数的传递问题(一级指针和二级指针)

  • 2010年04月13日 14:47
  • 41KB
  • 下载

44. 腾讯面试题: 使用函数的参数指针,分配内存空间问题

面试官写了一段程序: void fun(int* a) { a = new int[100]; cout
  • hhh3h
  • hhh3h
  • 2014年05月28日 20:21
  • 1493

关于用函数指针参数申请动态内存的问题

今天在写一个Binary Search Tree的程序时,发现其插入有问题,下面是插入程序,每次插入完成后,节点还是NULL。 template void CMyTree::insert(co...
  • u011068702
  • u011068702
  • 2016年07月02日 23:19
  • 497

C语言函数传递指针参数的问题

一个问题是,我们想用一个函数来对函数外的变量v进行操作,比如,我想在函数里稍微改变一下这个变量v的值,我们应该怎么做呢?又或者一个常见的例子,我想利用swap()函数交换两个变量a,b的值,我们应该怎...
  • lisayh
  • lisayh
  • 2017年12月20日 13:18
  • 14

c++之指针作为函数参数传递的问题

转:http://blog.csdn.net/fjb2080   其实,对于C 或者C++ ,最难的一块地方估计就是指针了。指针是强大的,但也是很多人载在这里的地方。   前段...
  • qqchenjunwei
  • qqchenjunwei
  • 2014年12月08日 18:37
  • 481
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:函数的指针参数传出时遇到的问题
举报原因:
原因补充:

(最多只允许输入30个字)