【问题标题】:Why can't I pass in a regular value to a function call that takes in a pointer?为什么我不能将常规值传递给接受指针的函数调用?
【发布时间】:2016-10-07 14:56:36
【问题描述】:

当我尝试编译我的代码时出现错误

无法将 'float' 转换为 'const float*'。

我在想也许我需要传递一个const,但这不重要。

#include <iostream>
using namespace std;

static float foo(const float *pArray,int n);

int main() {
    foo(3.145f,5);
    return 0;
}

static float foo(const float *pArray,int n)
{
    return 0;
}

【问题讨论】:

  • 听起来很明显,这是因为浮点数不是指向浮点数的指针。
  • 3.145f 不是数组或指针,它只是一个float
  • @NathanOliver 我不明白 *pArray 需要如何成为一个数组。如果它是一个数组,我们不会看到类似 pArray[5] 之类的东西。我想说的是,没有迹象表明 pArray 是一个数组,尽管名称表明它是一个数组,但它怎么会很明显呢?跨度>
  • @Darraptor;它是一个指针,您已经指出它是一个指向数组(第一项)的指针。如果需要,您可以将指针传递给单个 float。或者一个空指针。
  • 您可以通过传递 std::arraystd::vector 而不是原始指针(它们本身不区分用例)来使其“显而易见”

标签: c++ parameter-passing


【解决方案1】:

你必须传递一个指针

float number=3.145;
foo(&number,n);

【讨论】:

  • 最好使用float number= 3.145f;,因为3.145 是双精度字面量,而3.145f 是浮点型字面量。
  • @NathanOliver 但不应该 3.145 成为浮点数,因为即使它最初是双精度数,我们也将其转换为浮点数,还是我在这里遗漏了什么?
  • @Darraptor,当您尝试将任何类型的模板化代码与文字一起使用时,您会很快发现两者并不相同。
  • @Darraptor 是的,它会转换,但它应该发出缩小转换诊断。我们可以通过将其设为浮点文字来明确说明我们的意图来阻止这种情况。
  • @NathanOliver 如果我做类似 double call_me_float=2.00f;它会变成双重的吗?
【解决方案2】:

C++ 是一种静态类型和编译的语言。这意味着函数调用中任何参数的类型必须在编译时已知并与函数声明的类型相匹配。

不需要完全匹配:允许转换,但不能从 float 转换为 const float*,即从浮点数到内存地址。

在某些较旧的代码或某些 C 代码中,值是通过指针传递的。也就是说,不是传递值(在这种情况下为浮点数),而是传递存储该数字的内存地址。要使用具有中间结果或文字的此类函数,必须首先将值存储在某个变量中,然后将该变量的地址作为函数参数传递:

void foo(const float*);   // function declaration
foo(&(3.1415));           // ERROR: cannot take address of literal
float tmp = 3.1415;       // store number in variable
foo(&tmp);                // pass address of variable to function

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多