这是什么意思(C ++):“警告:指向算术[Wpointer-arith]中使用的函数的指针”?

时间:2012-12-07 21:26:00

标签: c++ arrays compiler-warnings

我正在制作一个C ++程序,并且有一个不断出现的警告(我正在使用g ++):

warning: pointer to a function used in arithmetic [Wpointer-arith]

我想知道:这条警告信息究竟是什么意思?什么是我的编译器试图告诉我问题是(一般而言)所以我可以更好地理解我做错了什么?

Google搜索针对人们代码中的特定问题提供特定解决方案,但从未告诉我此警告消息的确切内容。

我正在学习数组,我正在尝试制作一个打印“Hello,world!”的程序。一次只有一个字符,每个字符单独存储在一个数组中,然后在for循环中输入cout。

以下是代码:

#include <iostream>
using namespace std;

int ARRAY_ELEMENTS = 14;

void greeting()
{
    char greeting[ARRAY_ELEMENTS];
    greeting[0] = 'H';
    greeting[1] = 'e';
    greeting[2] = 'l';
    greeting[3] = 'l';
    greeting[4] = 'o';
    greeting[5] = ',';
    greeting[6] = ' ';
    greeting[7] = 'w';
    greeting[8] = 'o';
    greeting[9] = 'r';
    greeting[10] = 'l';
    greeting[11] = 'd';
    greeting[12] = '!';
    greeting[13] = '\0';
}
int main(int argc, char* argv[])
{
    greeting();
    for (ARRAY_ELEMENTS = 0; 
        ARRAY_ELEMENTS <= 13;
        ARRAY_ELEMENTS++)
    {
        cout << greeting[ARRAY_ELEMENTS] << endl;
    }
    return 0;
}

感谢您的时间。

4 个答案:

答案 0 :(得分:6)

在这一行:

cout << greeting[ARRAY_ELEMENTS] << endl;

您指的是名为greeting函数,您将其视为数组。

答案 1 :(得分:5)

问候语是一个函数,但是您尝试将其打印出来,就像它是一个char数组一样。函数greeting()包含一个相同名称的char数组,这对代码的清晰度没有帮助 - 这可能是你感到困惑的地方。如果你给出不同的名字,那就更明显是出了什么问题。

你需要让你的greeting()函数返回一些东西,而不是只填写一个本地数组,这个数组不能从函数外部访问(并且无论如何都会在函数返回后立即丢弃)。

答案 2 :(得分:2)

声明greeting[ARRAY_ELEMENTS]不符合您的想法。

main内部,名称greeting引用功能void greeting()。您似乎正在尝试打印char greeting[ARRAY_ELEMENTS]变量。但是您无法从main执行此操作,因为该名称仅在void greeting()内可见。

你应该重命名函数或变量,以确保不再发生这种混淆,除此之外,你还有两个选择:在函数greeting内部循环,或者将指针传递给缓冲区必须将问候语设置到功能中。这可能比你现在的水平要先进一点,但你最终必须学会如何做到这一点,所以没有时间像现在这样。

const int ARRAY_ELEMENTS = 14;

void make_greeting(char *greeting)
{
    greeting[0] = 'H';
    greeting[1] = 'e';
    ...
}

int main(int argc, char **argv)
{
    char buffer[ARRAY_ELEMENTS];

    make_greeting(buffer);

    std::cout << "The greeting is \"" << buffer << "\"" << std::endl;

    for(int i = 0; i != ARRAY_ELEMENTS; i++)
        std::cout << "At position " << i << ": '" << buffer[i] << "'" << std::endl;
}

当然,你应该只是使用std :: string而不是字符缓冲区。

答案 3 :(得分:0)

我认为这里的问题是这段代码

greeting[ARRAY_ELEMENTS]

不符合您的想法。这会尝试索引函数ARRAY_ELEMENTS的位置greeting,这不是函数。你得到的错误是由编译器认为你试图将greeting视为一个数组引起的,这不是你想要做的。

对此没有直接的解决方法,但您可以考虑执行以下操作之一:

  1. greeting更改为实际上是一个数组。
  2. 使greeting成为一个接收索引并生成相应数组值的函数。
  3. 希望这有帮助!