Frage zu einer C Code Aufgabe?
Das folgende Programm ist lediglich zu Vorführungszwecken gedacht und soll Sie mit Zeigerarithmetik vertraut machen. Gehen Sie daher den Code aufmerksam durch und versuchen Sie die Vorgänge nachzuvollziehen.
Hinweise:
- Wo werden Adressen oder Werte von Zeigern/Variablen ausgegeben/beeinflusst?
- Beachten Sie den Platzhalter „%p“, um Adressen von Pointern auszugeben und die notwendige Typenumwandlung der Variablen zu (void*) zu realisieren.
- Achten Sie auf die Adress-Abstände benachbarter Array Elemente. Was fällt Ihnen auf und wieso verhält es sich so?
- Es ist ein Befehl im Code enthalten, der nicht wirklich sinnvoll ist, da er keine Aktion ausführt. Welcher ist es? =
#include <stdio.h> int main(){//Variablendeklarationint
iAFeld[6] = {3, 7, 7, 9, 6, 9}; int * piZeiger = NULL; int
i = 0;
piZeiger = iAFeld;piZeiger++;.printf ( "Adresse des ersten Arrayelements: %p\n" , ( void )iAFeld); printf ( "Adresse des dritten Arrayelements: %p\n" , ( void )&iAFeld[2]); printf ( "Wert des Zeigers: %p\n\n" , ( void *)piZeiger); .//Ausgabe des Ausgangsarraysfor
(i = 0; i < 6; i++) printf ( "%i " ,iAFeld[i]); printf ( "\n" ); .//1. Schritt*(++piZeiger) = iAFeld[4];.//Ausgabe des Arraysfor
(i = 0; i < 6; i++) printf ( "%i " ,iAFeld[i]); printf ( "\n" ); //2. Schritt piZeiger+2; ++(*piZeiger); //Ausgabe des Arrays for
(i = 0; i < 6; i++) printf ( "%i " ,iAFeld[i]); printf ( "\n" ); //3. Schritt piZeiger += 2; *(piZeiger+1) = *piZeiger&12; //Ausgabe des Arrays for
(i = 0; i < 6; i++) printf ( "%i " ,iAFeld[i]); printf ( "\n" ); printf ( "\nZeiger zeigt auf die Stelle, dessen Inhalt ist: %i\n" , *(piZeiger++)); printf ( "Zeiger zeigt auf die Stelle, dessen Inhalt ist: %i" , *piZeiger);
return
0;
}
Meine erste Frage: was bedeutet piZeiger&12, meine zweite: warum ist der Befehl Zeiger +2 sinnlos? Es müsste wahrscheinlich heißen Zeiger = Zeiger +2 oder?
Und meine dritte Frage: was hat es mit dem Abstand der Adressen auf sich?
die eine Adresse endet mit d8 die andere mit d0 ansonsten sind sie identisch. ist also der Abstand immer ein Byte?
2 Antworten
*piZeiger&12
ist der Wert, auf den piZeiger zeigt verknüpft über "AND" mit 12 (12 = 0x0C = 0b0001100).
Ein Befehl, der keine "Wirkung" hat und lediglich einen Wert ermittelt der nicht weiterverwendet wird, ist sinnlos.
Der "Abstand" ist nicht ein Byte (sinnlose Aussage), sondern 8, das ergibt sich darauf, dass der Speicherbedarf für einen Zeiger durch die Systemumgebung bzw. die Programmbasis festgelegt ist. In einem 64-Bit-Programm sind Zeiger eben 64 Bit breit, in einem 32-Bit-Programm sind es 32 Bit (4 Byte).
Du solltest mal den Code neu formatieren oder das auf Pastebin hochladen. So ist das nur schwer lesbar.
Danke! Das mit dem bitweisen Und hab ich jetzt verstanden... nur was genau soll ich bei der Fragestellung tun? Was ist damit gemeint?
- Achten Sie auf die Adress-Abstände benachbarter Array Elemente. Was fällt Ihnen auf und wieso verhält es sich so?
Ja, dazu wollte ich gerade noch eine Verbesserung einschieben. Eine Speicheradresse beschreibt ein Byte, nicht ein Bit. Zwischen zwei Speicheradressen mit einem Abstand von 8 liegen also 8 Byte.
Du sollst sehen, dass die Größe benachbarter Array-Elemte von der Größer der einzelnen Elemente im Array abhängt. Also folgend:
Speicheradresse/Wert:
0x12340 / Hier fängt die erste Zahl an
0x12341 / Hier geht sie weiter
0x12342 / Hier ist sie immer noch
0x12343 / Meine Zahl ist jetzt 4 Byte groß
0x12344 / Hier beginnt die nächste Zahl
0x12345 / Da die Arrayelemente hintereinander liegen
0x12346 / aber trotzdem nicht nur eine Speicheradresse entfernt sind
0x12347 / hier endet die zweite 4-Byte-Zahl
0x12348 / hier würde die nächste beginnen
0x12349 / immer brav sizeof() verwenden
Nur zum Verständnis: Pointer zeigen immer auf den Beginn eines Wertes. Sie zeigen also auf das erste Element eines Arrays und auch auf die erste Speicheradresse einer Variable. Mithilfe des Typs des Pointers weiß das Programm, wie viele der folgenden Speicheradressen noch zu dem Wert gehören.
In meinem Beispiel wären also die Adressen der drei Elemente 0x12340, 0x12344 und 0x12348, da jedes Element 4 Byte groß ist und daher das nächste erst nach 4 Byte anfangen kann.
Okay alles klar! Jetzt ist es mir um einiges verständlicher, danke!
Nur habe ich grade bemerkt, dass ich mit dem bitweisen UND wohl doch noch Probleme habe...
Der Pointer Zeigt doch auf die 9... und wenn ich die 9 also in binär 1001 mit der 12 also 1100 addiere erhalte ich in dez 21... es sollte aber 4 rauskommen...
Ich versuche es mal:
*piZeiger&12: das ist der Operator für bitweise UND, also wird der Wert, auf den piZeiger zeigt mit 12 bitweise UND gerechnet.
Zeiger + 2 ist tatsächlich sinnlos, weil da ein Wert berechnet aber nicht verwendet wird.
Nein. Der Abstand zwischen Elementen eines Types ist immer sizeof(Type). Dieser von Dir festgestellte Abstand gilt prinzipiell nur auf dem System für den Typ int.