?
schau dir auch mal das Disassembly an, da kann man immer sehr schön erkennen, was aus irgendwelchen abstrakten Konstrukten von Hochsprachen tatsächlich wird.
char *string="HALLO";
char *testStr="A";
char testChar='A';
if(string[1]==testChar) // (1)
{
printf("(1) string[1]==testChar");
}
if(string[1]==testStr) // (2)
{
printf("(2) string[1]==testStr");
}
zu (1)
mov BYTE PTR [esp+0x17],0x41 ; 0x41 ist das Zeichen 'A', wird in [esp+0x17]=testChar gespeichert
...
cmp al,BYTE PTR [esp+0x17] ; byteweiser Vergleich zwischen string[1] (in al) und 'A' (in [esp+0x17]=testChar)
zu (2)
mov DWORD PTR [esp+0x18],0x8048516 ; 0x8048516 ist die Adresse von testStr, wird in [esp+0x18]=testStr gespeichert
...
cmp eax,DWORD PTR [esp+0x18] ; Double Word Vergleich zwischen string[1] und der Adresse von testStr
Gut, ist jetzt wieder komplizierter geworden als ich das wollte.
Kurz gesagt:
(1) Vergleich zwischen 'A' und 'A'
(2) Vergleich zwischen 'A' und 0x8048516 (=Adresse von testStr)
Wenn man dann an die Stelle 0x8048516 springt, sieht man außerdem, dass dort nicht nur ein 'A' steht, sondern ein 'A' und eine 0. Das heißt, "A" ==> 'A' + 0