2016-04-18 6 views
-2
#include <stdio.h> 

main() { 
    char *p = "Hello world"; 
    int *q; 
    p++; 

    q = (int*) p; 
    q++; 

    printf("\n %s\n%s", p, q); 
} 

Die Ausgabe dieses Programms ist dies:Erläutern Sie die Ausgabe dieses Codes über Zeiger

ello world 
world 

Kann jemand erklären, wie dieses Programm funktioniert?

+0

@Jonny Henly Sie erkennen, dass die Ausgabe nicht auf 2 Zeilen sein wird, weil keine neue Zeile, und dass der eigentliche Raum vor der zweiten "Welt" wichtig ist? – AntonH

+0

@AntonH Habe nicht gemerkt, dass vor "Welt" ein Platz war, mein Fehler. Aber "\ n% s \ n% s" 'hat 2 Zeilenumbrüche. –

+1

@JonnyHenly Mein Fehler dann. Wir hatten beide Recht, eine Sache, du die Newline, ich den Platz :) – AntonH

Antwort

3

In der p++ Linie, erhöhen Sie die Adresse p nach der anderen, als dass die Größe des byte Typs ist, so p endet an dem „e“ in der Zeichenfolge nach oben.

Dann ordnen Sie die gleiche Adresse von in q, so dass es auch auf "e". Dann inkrementieren Sie q, aber da es sich um einen Zeiger auf eine Ganzzahl handelt (Typ int, die in Ihrer Maschine 4 Byte lang ist), wird es um vier erhöht. Also fügt man dem "e", dem es zuvor geschaut hat, vier hinzu und sieht sich den Raumcharakter an.

+0

Ich möchte wissen, ob wir gespeichert werden können, Satz von Buchstaben in Char-Typ Variable – Ann

+0

Nein, Sie können nur ein Zeichen in einer Variablen des Typs Char speichern. Aber in Ihrem Beispiel ist 'p' nicht vom Typ' char', es ist von einem Typ Zeiger auf eine bestimmte Adresse im Speicher, wo Variablen vom Typ 'char' gespeichert sind, so beim Drucken druckt alle Zeichen in diesem Stück Speicher bis ein Nullzeichen gefunden wird. – atturri

+0

das bedeutet, wenn ich einen Typ von Zeiger setzt, richtet es sich nur auf diesen Typ Werte, wie es bricht die ** Hallo Welt ** zu Zeichen – Ann

0

char *p zeigt zuerst auf das erste Zeichen der Zeichenfolge Hello World. Die Anweisung p++ ändert den Zeiger p, um auf das zweite Zeichen der Zeichenfolge zu zeigen. Dies erklärt, dass Sie erhalten ello world, wenn Sie die Zeichenfolge mit Zeiger nach Inkrementieren drucken.

Wenn Sie den Zeiger einem Zeiger q zuweisen, der ein Zeiger auf int ist. Das Inkrementieren des Zeigers q ändert den Zeiger, um auf world zu zeigen (es zeigt auf das Leerzeichen). Es ist aufgrund der Tatsache, dass int ist 4 Bytes lang in Ihrer Maschine und inkrementieren einen Zeiger auf int, erhöht den Zeiger Inhalt von 4 Bytes. Wenn Sie eine Zeichenfolge mit Zeiger q drucken, druckt es daher world.

0

liegt daran, dass Sie die Zeigervariable nach dem Speichern der Zeichenfolge (p ++ und q ++) inkrementiert haben. wo in deiner printf-aussage druckst du das ganze% s nicht nur ein zeichen deshalb druckt es so. Ich hoffe du hast die Antwort bekommen!

Verwandte Themen