编译错误:从“int”转换为“int*”无效[-fpermissive] |

3

我遇到了编译器错误:

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;
                }
            }
        }
    }
}

I'm learning...


1
我相信问题出在 *pFinal = vector[nElementos-1] 这一行。请记住,虽然 "vector" 是一个 int* 类型的指针,但它的每个元素都是普通的 int 类型。 - Mr. Llama
4个回答

6

你的错误在这行代码中:

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

这是因为向量是一个int*,但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
@ruakh:我已经离开了C/C++领域,所以我手头没有编译器来尝试这个问题,但是我认为"vector + nElementos + 1 - 2"是完全合法的。我认为通常情况下,指针加上算术表达式的结果在内部是将指向对象的整数值乘以对象大小加到指针上。 - Jay
@Jay- C++ ISO规范指出,在数组中进行指针算术运算是有效的,只要你保持在数组内部或者指向数组结束后的一步。然而,如果超出这个范围,技术上会导致未定义行为,尽管大多数实现可能不会有问题。 - templatetypedef
@Jay:没错,但是vector + nElementos + 1不是一个有效的指针。我不仅指的是它指向未分配的内存;我还指的是你甚至不能假设你的编译器能够创建这样的指针。(指针不一定是整数——即使是,如果vector + nElementos是最大可能的整数会发生什么?)表达式vector + nElementos + 1在求值时会触发未定义行为,即使你从不引用该指针,即使你立即减去2 - ruakh
谢谢大家!!!我正在学习C++,所以不了解std::vector,我会去看一下的,再次感谢!社区很棒! 编辑:对我的英语表示抱歉。 - Andres29
@ruakh:嗯,有趣。所以你的意思是说"vector+(nElementos+1-2)"是被定义的,但"(vector+nElementos+1)-2"不是。指针加法不是结合律。好吧,这是有道理的。我强烈怀疑在实践中,任何编译器都会得到相同的结果,但我承认,你不应该依赖于“在技术上非法但在实践中似乎有效”的方法。另一方面,你可能对评估顺序做出了无效的假设。如果我真的关心的话,我想我会研究规格说明。 - Jay

2

vector 是一个指针,但是使用下标 vector[nElementos-1] 来引用它时,它会被解引用为一个 int 类型。看起来你想要的实际上是

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

0
数组访问/下标(即a[i],其中a是一个数组/指针,i是一个整数)是一个表达式,其类型是数组中所拥有的东西。
只需使用取地址运算符&将地址存储在指针中即可:
int *pComienzo = vector, *pFinal = &vector[nElementos-1];

0

您忘记了 & 符号。 vector[nElementos-1] 表示的是值,但是您需要一个指向 pFinal 的地址。

可以使用 *pFinal = &(vector[nElementos-1]) 或者 *pFinal = vector + nElementos-1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接