2010-05-23 21 views
23

Che cosa significa quando un oggetto ha 2 asterischi all'inizio?cosa significa ** in C

**variable 
+25

Ci vuole otto risposte per spiegare ciò che un puntatore ad una puntatore è? –

+6

@Andreas La gente fa tutte le domande banali, perché ottengono molti punti di vista (106 fino ad ora) e quindi molti upvotes. Quindi [16 upvotes in 17 minuti] (http://stackoverflow.com/questions/2893129/what-does-mean-in-c/2893145#2893145) per una risposta relativamente semplice –

+1

possibile duplicato di [Utilizza per più livelli di pointer dereferences?] (http://stackoverflow.com/questions/758673/uses-for-multiple-levels-of-pointerferences) –

risposta

27

È puntatore al puntatore. Per maggiori dettagli è possibile controllare: Pointer to pointer

EDIT Può essere un bene per esempio, per l'allocazione dinamica array multidimensionali:

come:

#include <stdlib.h> 

int **array; 
array = malloc(nrows * sizeof(int *)); 
if(array == NULL) 
{ 
    fprintf(stderr, "out of memory\n"); 
    exit or return 
} 
for(i = 0; i < nrows; i++) 
{ 
    array[i] = malloc(ncolumns * sizeof(int)); 
    if(array[i] == NULL) 
    { 
     fprintf(stderr, "out of memory\n"); 
     exit or return 
    } 
} 
+1

Sarebbe anche una buona idea dimostrare di liberare correttamente il multidimensionale array in ordine inverso di allocazione. –

+0

Sì, hai ragione :). Non dimenticare di usare \t per (int i = 0; i Incognito

+0

Grazie. Quel collegamento era il più vantaggioso. – numerical25

5

Significa che la variabile è un puntatore a un puntatore.

4

Puntatore a un puntatore.

5

Puntatore a un puntatore quando si dichiara la variabile.

Deve riferimento a doppio puntatore quando utilizzato al di fuori della dichiarazione.

40

In una dichiarazione, significa che è un puntatore a un puntatore:

int **x; // declare x as a pointer to a pointer to an int 

Quando lo si utilizza, deferenze due volte:

int x = 1; 
int *y = &x; // declare y as a pointer to x 
int **z = &y; // declare z as a pointer to y 
**z = 2; // sets the thing pointed to (the thing pointed to by z) to 2 
      // i.e., sets x to 2 
+0

E se si dovesse impostare z a 2 usando solo un punto * z = 2 ?? – numerical25

+3

@num Cambierà y per puntare alla posizione di memoria 2, e '* y = 1;' o '** z = 1;' entrambi proverebbero a cambiare la memoria all'indirizzo 2, che è quasi certamente al di fuori del legale intervallo che ti è stato assegnato –

1

È un puntatore a un puntatore. È possibile utilizzare questo se si desidera puntare a uno array oa const char * (stringa). Inoltre, in Objective-C con Cocoa questo è spesso usato per indicare un NSError*.

2

** la variabile è doppia dereferenza. Se la variabile è un indirizzo di un indirizzo, l'espressione risultante sarà il lvalue all'indirizzo memorizzato nella variabile *.

Può significare cose diverse se si tratta di una parte della dichiarazione:

tipo ** variabile significherebbe, d'altra parte, un puntatore a un puntatore, cioè, una variabile che può contenere l'indirizzo di un'altra variabile , che è anche un puntatore, ma questa volta a una variabile di tipo "tipo"

2

Significa che la variabile viene dereferenziata due volte. Si supponga di avere un puntatore a un puntatore a caratteri come questo:

char ** variabile = ...;

Se si desidera accedere al valore questo puntatore sta puntando, bisogna dereferenziarlo due volte:

** variabile

4

È possibile utilizzare cdecl per spiegare C-type.

C'è un'interfaccia online qui: http://cdecl.org/. Inserisci "int ** x" nel campo di testo e controlla il risultato.

1

puntatore ad un altro puntatore

+1

Se sta facendo una domanda di base, probabilmente ha bisogno anche del concetto di puntatore. – agf

1

** è un puntatore a un puntatore. Questi sono a volte utilizzati per matrici di stringhe.

0

è un puntatore al puntatore ,. come se * x significa che conterrà un indirizzo di una variabile che se dico m = & x di m è mostrato come int ** m