1

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

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

我想知道:这个警告信息到底是什么意思?我的编译器试图告诉我问题是什么(一般而言),这样我才能更好地理解我做错了什么?

谷歌搜索为人们的代码中的特定问题提供了特定的解决方案,但从来没有告诉我这个警告信息到底想表达什么。

我只是在学习数组,我正在尝试制作一个打印“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

4 回答 4

7

在这条线上:

cout << greeting[ARRAY_ELEMENTS] << endl;

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

于 2012-12-07T21:30:08.770 回答
5

greeting 是一个函数,但是您尝试将其打印出来,就像它是一个 char 数组一样。函数 greeting() 包含一个同名的 char 数组,这无助于代码的清晰度——这可能是您感到困惑的地方。如果您给事物起不同的名称,那么问题出在哪里会更明显。

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

于 2012-12-07T21:29:34.973 回答
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 而不是字符缓冲区。

于 2012-12-07T21:33:54.573 回答
0

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

greeting[ARRAY_ELEMENTS]

不做你认为它做的事。这试图索引到ARRAY_ELEMENTSfunction 的位置greeting,这不是一个函数。您得到的错误是由编译器认为您试图将greeting其视为数组引起的,这不是您想要做的。

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

  1. 更改greeting为实际上是一个数组。
  2. greeting创建一个接收索引并生成适当数组值的函数。

希望这可以帮助!

于 2012-12-07T21:30:31.450 回答