4 Stimmen

Wie funktioniert die unäre Addition bei C-Zeigern?

Ich weiß, dass der unäre Operator ++ zu einer Zahl eine Eins addiert. Wenn ich ihn jedoch auf einen int-Zeiger anwende, erhöht er sich um 4 (die Größe eines int auf meinem System). Warum ist das so? Zum Beispiel der folgende Code:

int main(void)
{
  int *a = malloc(5 * sizeof(int));
  a[0] = 42;
  a[1] = 42;
  a[2] = 42;
  a[3] = 42;
  a[4] = 42;
  printf("%p\n", a);
  printf("%p\n", ++a);
  printf("%p\n", ++a);
  return 0;
}

gibt drei Zahlen mit einer Differenz von 4 zwischen den einzelnen Zahlen zurück.

4 Stimmen

Das ist keine unäre Addition, das ist eine Vorinkrementierung. Die unäre Addition ist ein einzelnes +.

1 Stimmen

Beachten Sie, dass das, was Sie getan haben, ein Speicherleck verursacht hat, weil Sie nicht mehr free(a); da er nicht mehr auf den Anfang des zugewiesenen Speichers zeigt. Der Versuch, ihn zu diesem Zeitpunkt freizugeben, wäre ein undefiniertes Verhalten und kann zu einem Segmentierungsfehler führen (wenn Sie Glück haben).

0 Stimmen

@Bunnit "Unäre Addition ist ein einzelnes +" -- Nein, genauso wenig wie -x eine unäre Subtraktion ist. Addition und Subtraktion sind binäre Operationen. Ein einzelnes - ist eine Negation; ein einzelnes + ist ein No-op.

1voto

Jeffrey Greenham Punkte 1312

Dies geschieht, damit Sie nicht mittendrin auf eine ganze Zahl zugreifen müssen.

0voto

mingos Punkte 22796

Weil ein Zeiger kein Verweis ist ;). Er ist kein Wert, sondern nur eine Adresse im Speicher. Wenn Sie den Wert des Zeigers überprüfen, wird es eine Zahl sein, die möglicherweise groß ist und nichts mit dem tatsächlichen Wert zu tun hat, der an dieser Speicherposition gespeichert ist. Beispiel, printf("%p\n", a); gibt "2000000" aus - das bedeutet, dass Ihr Zeiger auf das 2000000ste Byte im Speicher Ihres Rechners zeigt. Er weiß so gut wie gar nicht, welchen Wert er dort gespeichert hat.

Jetzt weiß der Zeiger, auf welchen Typ er zeigt. In Ihrem Fall auf eine Ganzzahl. Da eine Ganzzahl 4 Bytes lang ist, muss der Zeiger, wenn Sie zur nächsten "Zelle" springen wollen, auf die er zeigt, 2000004 sein. Das ist gerade mal 1 Integer weiter, also a++ macht absolut Sinn.

Übrigens, wenn Sie sich 42 (aus Ihrem Beispiel), drucken Sie den Wert aus, auf den Sie zeigen: printf("%d\n", *a);

Ich hoffe, das macht Sinn ;)

0voto

Kartikya Punkte 455

Das ist einfach, denn wenn es sich um einen Zeiger handelt, in Ihrem Fall einen Integer-Zeiger, bedeutet ein unäres Inkrement, dass der Speicherplatz um eine Einheit erhöht wird, wobei eine Einheit die Größe des Integers ist.

Die Größe der Ganzzahl hängt von der Kompilierung ab, bei 32-Bit- und 16-Bit-Compilern beträgt sie 4 Byte, bei 64-Bit-Compilern 8 Byte.

Versuchen Sie, das gleiche Programm mit Zeichen Datentyp, wird es Unterschied von 1 Byte als Zeichen nimmt 1 Byte geben.

Kurz gesagt, die Differenz von 4 ist, dass die Sie gefunden haben, ist der Unterschied der GRÖSSE EINER EINZIGEN Zahl im Speicher.

Ich hoffe, das hat geholfen. Wenn nicht, helfe ich Ihnen gerne weiter, lassen Sie es mich einfach wissen.

0voto

Jim Balter Punkte 15501

"Warum tut es das?" Warum sollte man etwas anderes erwarten? Das Inkrementieren eines Punktes führt dazu, dass er auf das nächste Element des Typs zeigt, auf den er verweist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X