【问题标题】:Compiler error: invalid conversion from 'int' to 'int*' [-fpermissive]|编译器错误:从“int”到“int*”的无效转换 [-fpermissive]|
【发布时间】:2012-02-06 21:52:43
【问题描述】:

我得到一个编译器错误:

main.cpp|59|错误:从 'int' 到 'int*' 的无效转换 [-fpermissive]|

违规行是

int *pComienzo = vector, *pFinal = vector[nElementos-1];

为什么会出现错误?有人可以帮我吗?

下面是我的代码:

#include <iostream>
#include <ctype.h>

using namespace std;
const unsigned short int MAX_VAL = 10;

int LongitudCadena(char*);

int BuscarCaracter(char *cadena, char caracter);

void Ordenar(int *vector, int nElementos, bool ascendente);

int main()
{
    char *cadena = "asdasd";

    cout << LongitudCadena(cadena) << endl;

    cout << BuscarCaracter(cadena, 'a') << endl;

    int iArray[] = {5,4,3,2,1};

    Ordenar(iArray, 5, 1);

    cout << iArray << endl;

    return 0;
}

int LongitudCadena(char *cadena)
{
    char *c = cadena;
    for(int i = 0; i < MAX_VAL; i++)
    {
        if (c[i] == 0) break;
        cadena++;
    }

    return  cadena - c;
}

int BuscarCaracter(char * cadena, char caracter)
{
    char *pCadena = cadena;
    for (int i = 0; i < MAX_VAL; i++)
    {
        pCadena++;
        if (toupper(cadena[i]) == toupper(caracter))
        return pCadena- cadena;
    }

    return -1;
}

void Ordenar(int *vector, int nElementos, bool ascendente)
{


    int *pComienzo = vector, *pFinal = vector[nElementos-1];

    if (ascendente)
    {
        for (int i = 0; i < nElementos; i++)
        {
            for (; pComienzo < pFinal; pComienzo++, pFinal--)
            {
                if (*pComienzo > *pFinal)
                {
                    *pComienzo += *pFinal;
                    *pFinal -= *pComienzo;
                    *pComienzo -= *pFinal;
                }
            }
        }
    }
}

我正在学习...

【问题讨论】:

  • 我很确定这是*pFinal = vector[nElementos-1] 部分。请记住,虽然“向量”是 int*,但它的各个元素是常规的 ints。

标签: c++ arrays pointers


【解决方案1】:

你的错误在这一行:

int *pComienzo = vector, *pFinal = vector[nElementos-1];

原因是vectorint*,但vector[nElementos - 1] 是常规int。因此声明

int *pFinal = vector[nElementos - 1];

正在尝试将vector 的最后一个索引处的整数值分配给指针pFinal,因此出现编译器错误。

要解决此问题,您可能需要这样做

int *pFinal = &vector[nElementos - 1];

这使得pFinal 指向vector 的最后一个元素,或者

int *pFinal = vector + (nElementos - 1);

使用指针算法完成同样的事情。

也就是说,既然您使用的是 C++,为什么不使用提供的 std::vector 类型并完全避免使用指针?

希望这会有所帮助!

【讨论】:

  • +1,但我认为写vector + (nElementos - 1) 可能更好。 (请注意,vector + nElementos + 1 - 2 之类的行为是未定义的行为。vector + nElementos - 1 在技术上很好,但处于边缘地位!)
  • @ruakh:我已经离开了 C/C++ 领域,所以我没有方便的编译器来尝试这个,但我的印象是“vector + nElementos + 1 - 2”是完全合法的。我认为通常一个指针加上一个算术表达式会在内部将整数值乘以指向指针的对象的大小。
  • @Jay- C++ ISO 规范指出,只要您留在数组内或指向数组末尾的一步,数组中的指针运算就有效。在技​​术上更进一步会导致未定义的行为,尽管大多数实现可能对此没有问题。
  • @Jay:没错,但vector + nElementos + 1 不是一个有效的指针。我不仅仅意味着它指向未分配的内存;我的意思是你甚至不能假设你的编译器实际上可以创建这样一个指针。 (指针不一定是整数——即使是整数,如果vector + nElementos 是可能的最大整数会怎样?)表达式vector + nElementos + 1 在求值时会触发未定义的行为,即使您从未取消引用该指针,甚至如果你立即减去2
  • 谢谢大家!!!我在学习c++,所以对std::vector不了解,我再看看,谢谢!不错的社区!编辑:对不起我的英语
【解决方案2】:

vector 是一个指针,但将其下标为 vector[nElementos-1] 会将其取消引用为简单的 int。看起来你想要的却是

int *pComienzo = vector, *pFinal = &(vector[nElementos-1]);

【讨论】:

    【解决方案3】:

    数组访问/下标(即a[i],其中a 是数组/指针,i 是整数)是一个表达式,其类型是数组中的内容。

    只需使用地址运算符&amp;将地址存储在指针中:

    int *pComienzo = vector, *pFinal = &vector[nElementos-1];
    

    【讨论】:

      【解决方案4】:

      你忘记了&amp;vector[nElementos-1] 是值,而您需要 pFinal 的地址。

      *pFinal = &amp;(vector[nElementos-1])*pFinal = vector + nElementos-1

      【讨论】:

        猜你喜欢
        • 2015-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多