【问题标题】:not understandable pointers errors无法理解的指针错误
【发布时间】:2019-05-13 19:07:42
【问题描述】:

我遇到了两个错误,我不知道如何解决它们。

error 1: 
incompatible pointer types initializing 'int *' with an expression of type 'char *'  
error 2: 
invalid operands to binary expression ('int *' and 'int')|

感谢您的帮助! 谢谢!

void play(int *boom_number, char *players)
{
    int y;
    char temp;
    int *sorting_pointer = &players[LENGTH-1];
    int current_index=0;
    while (sorting_pointer!=players[0])
    {
        int position=((&sorting_pointer-&players[0])/sizeof(int));
        current_index=boom_number%position
        char temp[]=players[current_index]
        for (y=current_index; y<position;y++)
        {
            players[y]=players[y+1]
        }
        players[position]=temp
        *sorting_pointer--
    }
}

【问题讨论】:

  • 您有一些语法错误:最好复制/粘贴实际代码(并显示编译器不喜欢哪些行)。
  • *sorting_pointer-- 应该是sorting_pointer--;
  • char temp[]=players[current_index] 应该是temp=players[current_index];
  • 其他行也缺少;
  • int *sorting_pointer = &amp;players[LENGTH-1];char* 分配给int*。代码充满了错误。请重新开始,逐行添加函数,准确检查每一行的作用。

标签: c pointers


【解决方案1】:

您应该在编译时发出最大警告:

叮当

$ clang -Weverything -c test.c
test.c:7:10: warning: incompatible pointer types initializing 'int *' with an expression of type 'char *' [-Wincompatible-pointer-types]
    int *sorting_pointer = &players[LENGTH-1];
         ^                 ~~~~~~~~~~~~~~~~~~
test.c:9:27: warning: comparison between pointer and integer ('int *' and 'int')
    while (sorting_pointer!=players[0])
           ~~~~~~~~~~~~~~~^ ~~~~~~~~~~
test.c:11:40: error: 'int **' and 'char *' are not pointers to compatible types
        int position=((&sorting_pointer-&players[0])/sizeof(int));
                       ~~~~~~~~~~~~~~~~^~~~~~~~~~~~
test.c:12:34: error: invalid operands to binary expression ('int *' and 'int')
        current_index=boom_number%position
                      ~~~~~~~~~~~^~~~~~~~~

GCC

$ gcc -Wall -c test.c
test.c: In function ‘play’:
test.c:7:28: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
     int *sorting_pointer = &players[LENGTH-1];
                            ^
test.c:9:27: warning: comparison between pointer and integer
     while (sorting_pointer!=players[0])
                           ^~
test.c:11:40: error: invalid operands to binary - (have ‘int **’ and ‘char *’)
         int position=((&sorting_pointer-&players[0])/sizeof(int));
                        ~~~~~~~~~~~~~~~~^~~~~~~~~~~~
test.c:12:34: error: invalid operands to binary % (have ‘int *’ and ‘int’)
         current_index=boom_number%position
                                  ^
test.c:13:9: error: expected ‘;’ before ‘char’
         char temp[]=players[current_index]
         ^~~~
test.c:8:9: warning: variable ‘current_index’ set but not used [-Wunused-but-set-variable]
     int current_index=0;
         ^~~~~~~~~~~~~
test.c:6:10: warning: unused variable ‘temp’ [-Wunused-variable]
     char temp;
          ^~~~
test.c:5:9: warning: unused variable ‘y’ [-Wunused-variable]
     int y;

至于修复你的错误......

这里:

void play(int *boom_number, char *players)
{
    ...
    int *sorting_pointer = &players[LENGTH - 1];
    int position = ((&sorting_pointer - &players[0]) / sizeof(int));
    ...
}

你的意思可能是这样的:

void play(int *boom_number, char *players)
{
    ...
    char *sorting_pointer = &players[LENGTH - 1];
    size_t length = sorting_pointer - &players[0];
    ...
}

【讨论】:

    【解决方案2】:

    尽管 int 和 char 是兼容的类型,并且可以从 int 隐式转换为 char,相反,指针没有任何隐式转换,即使它的存储类型有。考虑:

    //int* c = &b;      //doesn't work, because &b is char *
    //char* d = &a;     // doesn't work, a is int *
    int* c = (int*)& b;  //compiled
    char* d = (char*)& d;  //compiled
    cout << *c << " " << *d << endl;
    

    不幸的是,显式的 C 转换会导致这些指针出现未定义的行为,因此我们得到了不希望的输出: 9-858993567 乙

    C++ 转换在这种情况下更可靠,所以 static_cast 而不是 C-conversion 会导致编译错误

    int * c = static_cast<int*>(&a); // error, invalid type conversion
    char * d = static_cast<char*>(&b); // error, invalid type conversion
    

    只有 reinterpret_cast 允许你做这样的事情。 因此,您不能在指针中存储类型不是指针类型的值。

    【讨论】:

    • 这个问题被标记为 C 而不是 C++。为什么要使用和讨论coutstatic_castreinterpret_cast
    • 是的,对不起,我的错。但是,如果我们继续阅读第二部分,我声明 C 中也没有这样的转换,我知道。
    • C 中有一些指针的隐式转换:To 和 from void * 并添加限定符。
    猜你喜欢
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 2015-06-23
    • 2023-02-06
    • 1970-01-01
    相关资源
    最近更新 更多