警告:比较不同的指针类型

时间:2015-07-26 09:14:14

标签: c++ c arrays pointers

通过提及数组的名称,我们得到数组的基址,该地址与数组的第0个元素的地址相同。

因此我这样做了......

int main()
{
    int myArray[10] = { 1, 2 };

    if (myArray == &myArray == &myArray[0])
        printf("Address are equal!!!");

    return 0;
}

程序没有打印任何内容,我收到了上述警告。 任何人都可以帮我理解这个概念吗? 感谢。

3 个答案:

答案 0 :(得分:6)

首先,yArray == &myArray == &myArray[0]不会按预期执行。

其次,&myArray的类型为int (*)[10],而yArray&myArray[0]的类型为int *。两种类型都互不兼容。

答案 1 :(得分:1)

if语句中的条件

if (myArray == &myArray == &myArray[0])

相当于

if ( ( myArray == &myArray ) == &myArray[0])

在第一个子表达式中,左操作数myArray具有类型int *,因为表达式中使用的数组指示符被隐式转换为指向数组的第一个元素的指针。 右操作数&myArray指向整个数组,声明为

int myArray[10] = { 1, 2 };

所以它的类型是int ( * )[10]。 虽然两个指针包含的值相同,即数组占用的内存范围的地址,但它们具有不同的类型,并且没有从一种类型到另一种类型的隐式转换。因此编译器应发出诊断消息。

但是如果编译器将编译代码,则指针具有相同的值和条件

( myArray == &myArray )

评估为true

所以你会在评估这个条件之后得到

if ( true == &myArray[0])

很明显,&myArray[0]不等于1,对应于转换后true的算术值,整个条件将评估为false

所以if语句没有意义。

您可以改为编写

if ( myArray == &myArray[0])

或以下方式

if ( ( ( void * )myArray  == ( void * )&myArray ) && 
     ( ( void * )&myArray == ( void * )&myArray[0] ) )

答案 2 :(得分:0)

等于运算符==的结果是布尔值(在C ++中)或C中的整数。因此,取决于编译器评估整个事物的顺序(BTW是依赖于实现的),这些比较之一将整数/布尔值与指针进行比较。 C允许您将整数与指针进行比较。 C ++没有。

您的代码的另一个问题是,比较中每个子表达式的结果具有不同的类型。 myArray降级为(int*)&myArray[0]降级为&myArray(int**) 降级降为int (*)[10],实际类型为findstr }。