2016-06-13 22 views
0

Ich bin neu in C/C++ Programmierung und ich lerne immer noch einige Unterschiede zwischen Zeiger Datentypen. Aber ich kämpfte mit diesen ein:Unterschied zwischen Zeiger Datentypen C

int *const x1; 
const int *x2; 
char *x3[3]; 
char (*x4)[3]; 
double* x5, x6; 

Ich denke, die erste ein Integer-Variable sein soll, die Adresse auf eine konstanten Speicherpunkt
Und x2 sollte eine ganze Zahl Pointer sein, die const ist, nicht wahr?

Ich weiß nicht, ob das richtig ist. Kann mir jemand die Unterschiede erklären?

+0

Hinweis: dass "Int * a" ist Ein Zeiger, "int a [2]" ist auch ein Zeiger (Array), der auf 2 Werte zeigt. 'int * a [2]' ist ein Zeiger auf ein Array. Es kann Ihnen helfen, ein wenig zu verstehen – Hearner

+1

@Hearner: 'int a [2]' ist ** nicht ** ein Zeiger (obwohl es in bestimmten Fällen * zu einem Zeiger * zerfallen * kann). –

+1

@Hearner 'int * a [2]' ist ein Array von Zeigern. –

Antwort

3
int *const x1; // const pointer to int 
       // x1 is const pointer, so it cannot point to anything else (once initilized), 
       // but what it points to can changed 

const int *x2; // pointer to const int 
       // x2 can points to something else, 
       // but what it points to cannot be changed 

char *x3[3]; // array of three pointers to char 
       // (array of pointers) 

char (*x4)[3]; // pointer to array of three char 
       // (single pointer) 

double* x5, x6; // x5 is pointer to double, x6 is just a double 
+1

Das letzte Beispiel sollte nicht so geschrieben werden. Das '*' gehört zum Variablennamen, daher sollte der Stern mit dem Namen wie bei den anderen Deklarationen stehen. – Olaf

2

Für Probleme wie diese können Sie mit cdecl, z. für Ihr drittes Beispiel:

char *x3[3]; 

cdecl kehrt:

declare x3 als Array 3 von Zeiger

und für Ihr viertes Beispiel char:

char (*x4)[3]; 

cdecl Rückkehr:

declare x4 als Zeiger auf Array 3 von char

+1

cdecl funktioniert nicht mit mehreren Deklarationen (z. B. 'double * x5, x6;'). – Holt

+3

@Holt: wahr - du müsstest ein wenig gesunden Menschenverstand anwenden und nicht von der Assoziativität des '*' erwischt werden - ich hatte nicht vor, * alle * OP's Hausaufgaben für ihn zu tun. ;-) –

+1

Danke für diese Webseite. Wusste nicht, dass es so etwas gibt. – Velox

2

Sie C lesen Deklaratoren rückwärts. "int * const" ist daher ein konstanter Zeiger auf int (Sie können das int ändern, aber den Zeiger nach der Initialisierung nicht anderswo positionieren); während "const int *" ist ein Zeiger auf eine Konstante int (ändern Sie den Zeiger alles, was Sie mögen, aber nicht das int, auf das es zeigt).

"Die C-Deklaratorsyntax ist ein Experiment, das fehlgeschlagen ist." nach Bjarne Stroustrup.

2
int *const x1; 

konstante Zeiger auf int, dass der Zeiger bedeutet nicht-zu-Punkt nichts geändert werden.

const int *x2; 

Zeiger auf int Konstanten. Hier ist die ganze Zahl konstant, was bedeutet, dass Sie den Wert nicht ändern können.

char *x3[3]; 

array (die Länge 3) von Zeigern auf char

char (*x4)[3]; 

Zeiger auf ein Feld (mit einer Länge von 3) von char

double* x5, x6; 

x5 Zeiger zu verdoppeln, x6 ist nur eine double Variable

Verwandte Themen