2011-01-12 19 views
0

Ich frage mich, was ist der Unterschied zwischen diesen beiden Codezeilen?Einfache Frage zu *

int hi; 
int *hi; 

In der Programmiersprache C?

Danke! Amit

+0

Danke für die Bearbeitung @Frustrated, ... – Amit

+2

Sie Vielleicht möchten Sie ein tieferes Verständnis von Zeigern gewinnen: http://www.eskimo.com/~scs/class/notes/sx10b.html – FrustratedWithFormsDesigner

Antwort

8
int hi; 

Reserven der Speicherplatz für eine int im Speicher, und jedes Mal, wenn Sie hi verweisen, lesen oder schreiben Sie direkt, dass int im Speicherbereich.

int *hi; 

behält den Raum für ein pointer zu einem int im Speicher, jedesmal, wenn hi verwendet wird, ist der Zeiger entweder gelesen oder geschrieben. Das heißt, Sie sind nicht arbeiten mit einer int, nur ein Zeiger auf eine int - es muss eine int irgendwo für den Zeiger, etwas funktionsfähig Referenz zu existieren. Zum Beispiel

int hi; 
int *phi; 
phi = &hi; // phi references the int hi 
*phi = 3; // set `hi` to 3 
+0

Fantastisch. Genau das, was ich wissen wollte. Könnte ich Sie mit nur einer weiteren Frage belästigen? Ich habe gesehen, Zeiger sehr ausgiebig verwendet. Warum? Warum sind sie so besonders? Warum bevorzugen manche Zeiger lieber als ganze Zahlen? – Amit

+0

Sorry, bedeutete nicht ganze Zahlen, int Variablen gemeint. – Amit

+0

Noch ein Kommentar, sorry. Wenn ich so etwas hätte: 'int hi [4]; int * phi; phi = &hi[2]; 'Dies würde phi den Wert eines dritten (angenommenen 0-Index) Wertes des Arrays von' hi' geben. Ist es nun möglich, dies ohne Zeiger zu erledigen? Zum Beispiel: "int hi [4]; int phi; phi = hi [2]; '. Würde das nicht dasselbe tun? Wenn ja, kann ich jetzt endlich sehen, warum Zeiger nützlich sind. – Amit

2

int hi deklariert die Variable hi als integer. int *hi deklariert die Variable hi als pointer zu einer Ganzzahl.

1

Der erste deklariert eine Integer-Variable, während der zweite einen Zeiger auf eine ganze Zahl deklariert.

Pointers sind über den Rahmen eines Stackoverflow Post, aber this Wikipedia article ist ein Ausgangspunkt, und es sollte mindestens ein Kapitel über die Zeiger in sein, was auch immer buchen Sie verwenden C. zu lernen

0

a. int i;
b. int *address;
c. address = &i;

In Zeile a wird eine ganzzahlige Variable mit dem Namen i deklariert. Wenn dies getan wird, reserviert der Compiler einen Speicherplatz der Größe sizeof(int) (es ist 4 Byte auf meinem Computer). Wenn Sie auf diesen Speicherplatz verweisen möchten, müssen Sie Zeiger verwenden.

Zeile b deklariert eine Variable mit dem Namen address, die eine spezielle Eigenschaft hat. Diese Variable enthält keine int, aber es speichert die Adresse einer Variablen vom Typ int. Daher muss der Wert address als Adresse einer Variablen vom Typ int interpretiert werden. Momentan enthält die Variable address keine Speicheradresse, da wir noch nicht definiert haben, welche Speicheradresse der Variablen sie haben muss.

Zeile c kann gelesen werden als "Adresse ist gleich der Speicheradresse der Variablen i". Jetzt speichert die Variablenadresse die Speicheradresse der int Variablen i.

int main(){ 
    int a; 
    int &b; 
    b=&a; 
    a=10; 
    return 0; 
} 

Wenn dieser Code einen Debugger ausgeführt wird, unter Verwendung Ich sehe:

a = 10 // the variable's value 
b = 0x7fffffffe2fc // this is the address at which 'a' is stored. 

Pointers sind sehr leistungsfähig und Sie werden es beginnen, öfter zu benutzen, wenn Sie es verstehen. Abgesehen von den Materialien, die andere für Sie vorgeschlagen haben, empfehle ich, einen Debugger (gdb) zu verwenden und ein paar Programme mit Zeigern darin auszuführen und jede Variable zu überprüfen, die Sie im Code deklariert haben. Ich verstehe die Dinge besser, wenn ich ein visuelles Bild von irgendeinem Problem habe und ich denke, es könnte auch Ihr Verständnis von Zeigern beschleunigen.

0

int hi ------ zeigt an, dass hi die ganze Zahl ist, die 2 Bytes dafür zuweist. int * hi ------ * gibt den Zeiger an, der die Adresse der Variablen enthält, und diese Variable ist eine ganze Zahl. sind beide unterschiedlich.ein gibt die ganze Zahl an und die andere gibt die Adresse der ganzen Zahl an.

0

int hi; reserviert einen Platz im Speicher für eine Integer-Variable, während int * ptr; reservieren Sie einen Platz im Speicher für einen Zeiger, der die Speicheradresse anderer Variablen enthält. Sie können die Zeiger auf verschiedene Arten verwenden.

int *ptr = hi; 
int *ptr; 
ptr = &hi; 

, wenn Sie den Wert ändern der Sie die Adresse ändern ptr, wo es zeigt aber, wenn Sie den Wert nach de-Verweisen auf die Adresse geändert Sie den Wert der anderen Variablen verändern.

*ptr = 3; 

führt zur Änderung des Wertes von hi;

1

hi speichert den Typ Integer-Wert in einem bestimmten Ort, sondern
*hi speichert die Adresse eines beliebigen Typs int Variable.

Beispiel:

int hi = 10; 
int *hello = &hi; 
0

Erste - int hallo; Hier deklarieren Sie eine ganzzahlige Variable mit dem Namen "hi"

Dann - int * hi; hier „hallo“ ist ein Zeiger, der auf einen ganzzahligen Wert

Hinweis zeigen kann: int * hallo und int * hallo syntaktisch gleiche