Frage zu einer C Code Aufgabe?

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.

J0T4T4  10.06.2018, 12:37

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.

1
Yaasxy 
Fragesteller
 10.06.2018, 12:40
@J0T4T4

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?
0
J0T4T4  10.06.2018, 12:47
@Yaasxy

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
1
J0T4T4  10.06.2018, 12:51
@J0T4T4

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.

1
Yaasxy 
Fragesteller
 10.06.2018, 13:00
@J0T4T4

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...

0
Yaasxy 
Fragesteller
 10.06.2018, 13:03
@Yaasxy

Ach ich hab mich vertan :D habs doch raus..

0
J0T4T4  10.06.2018, 19:31
@Yaasxy

Dann ist ja super! Freut mich, dass Du es verstanden hast :D

1