Warnung: Vergleich von verschiedenen Zeiger-Typen
Durch die Erwähnung der name des array ist, erhalten wir die Basis-Adresse des Arrays ist gleich der Adresse des 0. Elements des Arrays.
Daher habe ich diese...
int main()
{
int myArray[10] = { 1, 2 };
if (myArray == &myArray == &myArray[0])
printf("Address are equal!!!");
return 0;
}
Programm nicht drucken nichts und ich bekomme die oben genannte Warnung.
Kann jemand mir helfen zu verstehen, dieses Konzept?
Danke.
- Aktivieren Sie die Warnungen deines Compilers und zu lösen.
- Verwenden
&&
zu kombinieren Boolesche Ausdrücke. if (myArray == (int*)&myArray && (int*)&myArray == &myArray[0])
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst
yArray == &myArray == &myArray[0]
ist nicht zu tun, was Sie erwarten.Zweiten
&myArray
ist der Typint (*)[10]
währendyArray
und&myArray[0]
Typint *
. Beide Arten sind nicht miteinander vereinbar.Die Bedingung in der if-Anweisung
entspricht
In der ersten Teilausdruck der linke operand
myArray
Typint *
weil ein array-Bezeichner verwendet, die in Ausdrücken implizit in Zeiger auf das erste element des Arrays.Der Rechte operand
&myArray
Punkte auf das gesamte array deklariert wieSo Ihre Art ist
int ( * )[10]
.Obwohl die beiden Zeiger den gleichen Wert enthalten, das ist die Adresse von dem Umfang der belegten Speicher durch das array trotzdem haben Sie verschiedene Arten und es gibt keine implizite Konvertierung von einem Typ in einen anderen. So sollte der compiler-Ausgabe einer diagnosemeldung.
Aber wenn der compiler kompiliert den code, dann die Zeiger haben den gleichen Wert und Zustand
ausgewertet
true
.So erhalten Sie nach der Auswertung dieser Bedingung
Es ist offensichtlich, dass
&myArray[0]
ist nicht gleich 1, entspricht das arithmetische Wert vontrue
nach seiner Bekehrung und der ganze Zustand bewerten zufalse
.Also die if-Anweisung nicht sinnvoll.
Könnte man stattdessen schreiben
oder die folgende Art und Weise
myArray == &myArray
nicht zu true ausgewertet werden. Es ist ein Ungültiger Vergleich, damyArray
Typ " array von 10int
die, in einen Ausdruck umgewandelt wird, um einen Zeiger aufint
(D. H. auf eineint *
), während&myArray
ist ein Zeiger auf ein array von 10int
(D. H. auf eineint (*) [10]
).Das Ergebnis der Gleichheitsoperator
==
ist ein boolean (in C++) oder einen integer in C. Also je nachdem, in welcher Reihenfolge der compiler wertet die ganze Sache (die BTW, ist von der Implementierung abhängig) einer dieser Vergleiche ist der Vergleich eines integer/boolean mit einen Zeiger. C ermöglicht Ihnen das vergleichen von ganzen zahlen mit Zeiger. C++ nicht.Dem anderen problem mit deinem code ist, dass das Ergebnis jedes einzelnen Teilausdrücke in Ihre Vergleiche, hat einen anderen Typ.
myArray
degradiert zu(int*)
wie&myArray[0]
, während&myArray
degradiert zu(int**)
mit den eigentlichen Typint (*)[10]
.&myArray
degradiert zu(int**)
??==
operator ist Links-nach-rechts-assoziativ. Soa == b == c
entspricht(a == b) == c