【问题标题】:invalid pointer conversion C++无效的指针转换 C++
【发布时间】:2021-07-20 02:09:35
【问题描述】:

我很高兴在这里发布我的第一个问题。

所以我玩了一点指针来理解这个概念,我发现了这个错误

错误:从‘int*’到‘int’的无效转换[-fpermissive]

这里是代码:


#include <iostream>

using namespace std;

int main(){

    int* pa,pb,pc,a,b,c;

    pa = &a;
    cin >> a;
    cout <<"the value of a :"<<a<<endl;
    cout <<"the value of pointer of a :"<<*pa<<endl;

// the problem begins when reading values of b :

    pb = &b; //<== error 
    cin >> b;

    cout << "the value of b : "<<b<<endl;
    cout <<"the value of pointer of b" <<*pb<<endl;
    
    return 0;
}

我不知道为什么它使用变量 a 成功但在 b 中使用相同的语法却失败了?

编辑:谢谢大家,我知道这个问题很简单,但我从你那里学到了:)

【问题讨论】:

  • b 是什么类型? &amp;b 是什么类型? pb是什么类型的?
  • 有时在一行上定义多个变量是不值得的。
  • 这导致了一个问题,为什么你会期望pb 是一个指针,但不期望b 稍后在同一行。您可能会在自己探索这个问题时学到一些有用的东西。
  • 每个声明只声明一个名称并在合理的情况下对其进行初始化的另一个原因。
  • 第一个问题不错,顺便说一句。格式良好,易于阅读和理解。

标签: c++


【解决方案1】:

* 绑定到变量名,而不是类型。所以你真正想要的是:

int *pa,*pb,*pc,a,b,c;

【讨论】:

    【解决方案2】:

    在声明中

    int* pa,pb,pc,a,b,c;
    

    只有pa 被声明为int*。其他变量声明为int

    您需要将变量声明为

    int *pa, *pb, *pc, a, b, c;
    

    【讨论】:

      【解决方案3】:

      一个常见的建议是每行声明一个变量(参见例如ES.10: Declare one name (only) per declaration),因为* 属于变量,而不是类型,这可能会造成混淆。你的

      int* pa,pb,pc,a,b,c;
      

      其实是

      int* pa;
      int pb;
      int pc;
      int a;
      int b;
      int c;
      

      但你想要:

      int* pa;
      int* pb;
      int* pc;
      int a;
      int b;
      int c;
      

      换句话说,您会收到错误,因为您的代码 pbint,但 &amp;bint*。第一个赋值就ok了,因为pa是一个指针。

      另一个常见的建议是始终初始化变量(请参阅ES.20: Always initialize an object),这样会更好

      int a = 0;
      int b = 0;
      int c = 0;
      int* pa = &a;
      int* pb = &b;
      int* pc = &c;
      

      一旦你弄清楚papbpc 是什么类型,你就可以使用auto 来获得“恰到好处的类型”:

      auto a = 0;     // 0 is an integer literal of type int
      auto b = 0;
      auto c = 0;
      auto* pa = &a;  // auto would be fine too, &a is a int*
      auto* pb = &b;
      auto* pc = &c;
      

      【讨论】:

      • 和初始化它会变成auto a = 0; \n auto pa = &amp;a;等等。
      • @CaptainGiraffe 好点,只是不确定auto 因为考虑到操作问题,它可能会隐藏他们的问题
      • 确实,但是你已经把类型描述得这么漂亮了 =)
      猜你喜欢
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多