Ich versuche, Hinweise zu lernen, und bin gerade auf eine Situation gestoßen, die ich nicht verstehe.
int main()
{
int num[3][2]={3,6,9,12,15,18};
printf("%d %d",*(num+1)[1],**(num+2));
}
Nach dem, was ich gelernt habe, sollte die Ausgabe sein:
12 15
aber eigentlich ist es:
15 15
Wieso den? Bitte klären Sie, wie die Dinge hier als erstes berechnet werden, was ich denke *(num+1) Lassen Sie sich berechnen und zeigen Sie auf die 1. dh {9,12} und dann [1] sollte auf das erste Element verweisen, dh 12.
Ich verwende den GCC-Compiler.
Weitere Informationen zur Operatorpriorität finden Sie unter siehe diese Tabelle.
– WhozCraig
16. Oktober 2014 um 7:44 Uhr
@WhozCraig: Ja, das war wirklich hilfreich. Danke. Können Sie mir auch einige Links oder Tutorials vorschlagen, von denen ich solche und noch komplexere Zeigerarithmetik lernen könnte?
– Suraj
16. Oktober 2014 um 7:55 Uhr
@Suraj Ehrlich gesagt gibt es keinen besseren Ersatz, als einfach selbst kurze Konsolen-Apps zu entwickeln, die damit spielen. Besonders mit Bootsladungen der Ausgabe mit dem Plattform-Zeiger-Formatbezeichner %p zum printf. Es gibt eine Reihe subtiler Nuancen, die sich ehrlich gesagt nur durch praktische Erfahrung in Ihrem Kopf verfestigen können. Google ist Ihr Freund, genau wie diese Seite. Nachschlagen [c] pointer arithmetic Für ein Fülle von anständigen ähnlichen Fragen. Und ein Debugger (Einzelschritt und Betrachten von Vars) ist äußerst hilfreich.
– WhozCraig
16. Oktober 2014 um 8:00 Uhr
Neben anderen Problemen mit dem Code beginnen alle Arrays mit 0 und nicht mit 1, also einem Offset von [1] wählt tatsächlich den zweiten Eintrag im Array aus.
Zusammen mit den zusätzlichen * (in meinem Beispiel nicht geschrieben),
es wird dasselbe wie die zweite Sache.
Operatorpriorität und Auswertungsreihenfolge sind orthogonal.
– Leichtigkeitsrennen im Orbit
16. Oktober 2014 um 9:42 Uhr
Okay, böses Wort. Besser? 🙂
– Abweichler
16. Oktober 2014 um 10:08 Uhr
Das Erreichen dieses Ziels impliziert jedoch immer noch eine Verarbeitungsreihenfolge, die nicht mit der Art und Weise zusammenhängt, wie Token analysiert werden.
– Leichtigkeitsrennen im Orbit
16. Oktober 2014 um 10:09 Uhr
@LightnessRacesinOrbit: senkrecht? das würde bedeuten, dass sie völlig unabhängig sind, aber es gibt klare Abhängigkeiten.
– Karoly Horvath
12. November 2014 um 10:04 Uhr
@KarolyHorvath: Vielleicht ja, aber der Ausdruck “vorher verarbeiten” impliziert eine Bewertung, während Bewertung und Vorrang (dh während des Parsens) immer noch zwei verschiedene Dinge sind.
– Leichtigkeitsrennen im Orbit
12. November 2014 um 10:37 Uhr
13300700cookie-checkUngültige Ausgabe im „int“-Arrayyes
Weitere Informationen zur Operatorpriorität finden Sie unter siehe diese Tabelle.
– WhozCraig
16. Oktober 2014 um 7:44 Uhr
@WhozCraig: Ja, das war wirklich hilfreich. Danke. Können Sie mir auch einige Links oder Tutorials vorschlagen, von denen ich solche und noch komplexere Zeigerarithmetik lernen könnte?
– Suraj
16. Oktober 2014 um 7:55 Uhr
@Suraj Ehrlich gesagt gibt es keinen besseren Ersatz, als einfach selbst kurze Konsolen-Apps zu entwickeln, die damit spielen. Besonders mit Bootsladungen der Ausgabe mit dem Plattform-Zeiger-Formatbezeichner
%p
zumprintf
. Es gibt eine Reihe subtiler Nuancen, die sich ehrlich gesagt nur durch praktische Erfahrung in Ihrem Kopf verfestigen können. Google ist Ihr Freund, genau wie diese Seite. Nachschlagen[c] pointer arithmetic
Für ein Fülle von anständigen ähnlichen Fragen. Und ein Debugger (Einzelschritt und Betrachten von Vars) ist äußerst hilfreich.– WhozCraig
16. Oktober 2014 um 8:00 Uhr
Neben anderen Problemen mit dem Code beginnen alle Arrays mit 0 und nicht mit 1, also einem Offset von [1] wählt tatsächlich den zweiten Eintrag im Array aus.
– Benutzer3629249
16. Oktober 2014 um 8:14 Uhr
@deviantfan Entschuldigung, mein Fehler!
– Grijesh Chauhan
16. Oktober 2014 um 11:29 Uhr