• 5386阅读
  • 6回复

[提问]QT 函数使用指针返回参数问题 [复制链接]

上一主题 下一主题
离线dafei2015
 

只看楼主 倒序阅读 楼主  发表于: 2018-09-14
关键词: qt5指针
我想以char *指针的形式传入参数,返回字符串,代码如下:
MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)
{
char *p="ABC";  test(p);  qDebug()<<p;
}

void MainWindow::test(char* p)
{
   p= "hello";
}
实际上打印输出的是"ABC",而不是"hello",是什么原因呢,哪位大侠指点下,谢谢了!

离线青空飞羽

只看该作者 1楼 发表于: 2018-09-14
需要用二级指针

MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)
{
char *p="ABC";  test(&p);  qDebug()<<p;
}

void MainWindow::test(char** p)
{
   *p= "hello";
}
离线大漠之鹰

只看该作者 2楼 发表于: 2018-09-14
楼上正解
本是后山人,偶作前堂客,醉舞经阁半卷书,坐井说天阔。大志戏功名,海斗量福祸,论到囊中羞涩时,怒指乾坤错
QQ:874164244
离线dafei2015

只看该作者 3楼 发表于: 2018-09-14
回 青空飞羽 的帖子
青空飞羽:需要用二级指针
MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)
{
char *p="ABC";  test(&p);  qDebug()<<p;
....... (2018-09-14 11:04) 

谢谢,我再理解下
离线九重水

只看该作者 4楼 发表于: 2018-09-14
楼主实际上是不理解形参和实参的区别。
指针(比如字符串指针)只是个表象。

假如修改test函数参数为char类型,楼主就可以正确了解了
void MainWindow::test(char p)
{  
   p = 3;
}

调用test函数:
char a = 4;
test(a);
很显然,这个类型为char的函数并不会改变a的值;


我们再修改一下函数的参数类型为char*:
void MainWindow::test(char* p)
{  
   Q_ASSERT_X(p != nullptr, "pointer error", "pointer p == nullptr");
   *p = 3;  //注意是*p,不是p
}
调用它:
char a = 4;
test(&a); //注意要传递一个指针进来&a
调用完后 a的值被修改为3

最后,我们再来看楼主的需求:传递一个字符串回去,
我们先做个分解动作:
修改test函数为:
void MainWindow::test(char* p, unsigned int len)
{  
   Q_ASSERT_X(p != nullptr, "pointer error", "pointer p == nullptr");
   char str[] = {'s', 't', 'r'};  //故意写成数组好理解一些,好多人对指针有天然的恐惧,但很喜欢数组
   unsigned int max = 3;
   if(max > len){
       max = len;
    }

    for(unsigned int i = 0; i < max; i++){
         p【i】 = str【i】;   //或 *(p+i) = str【i】;
    }
}

调用函数test:
char *a = "123";
test(a);
调用后a指针指向的“123”,变成了"str";

最后的最后,就是2楼的方法(我就不抄2楼了),它传回去是将指针的指向改变了!
但是我想说这是危险的做法。


离线九重水

只看该作者 5楼 发表于: 2018-09-14
for循环里面的中括号和i被系统吃掉了,编辑不了,哈哈
离线dafei2015

只看该作者 6楼 发表于: 2018-09-21
回 九重水 的帖子
九重水:楼主实际上是不理解形参和实参的区别。
指针(比如字符串指针)只是个表象。
假如修改test函数参数为char类型,楼主就可以正确了解了
void MainWindow::test(char p)
....... (2018-09-14 14:21) 

快速回复
限100 字节
 
上一个 下一个