2010-05-23 24 views
23

¿Qué significa cuando un objeto tiene 2 asteriscos al principio?¿Qué significa ** en C

**variable 
+25

¿Se necesita ocho respuestas para explicar lo que es un puntero a una puntero es? –

+6

@Andreas La gente salta sobre las preguntas triviales, porque obtienen muchas vistas (106 hasta ahora) y, por lo tanto, muchos votos ascendentes. Por lo tanto [16 votaciones ascendentes en 17 minutos] (http://stackoverflow.com/questions/2893129/what-does-mean-in-c/2893145#2893145) para una respuesta relativamente básica –

+1

posible duplicado de [Usos para múltiples niveles de desreferencias del puntero?] (http://stackoverflow.com/questions/758673/uses-for-multiple-levels-of-pointer-dereferences) –

Respuesta

27

Puntero a puntero. Para más detalles se puede comprobar: Pointer to pointer

EDITAR Puede ser bueno, por ejemplo, para asignar dinámicamente las matrices multidimensionales:

igual:

#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

También sería una buena idea demostrar que se libera de manera adecuada el multidimensional matriz en orden inverso de asignación. –

+0

Sí, tienes razón :). No olvide utilizar \t para (int i = 0; i Incognito

+0

Gracias. Ese enlace fue el más beneficioso. – numerical25

5

Significa que la variable es un puntero a un puntero.

5

Puntero a un puntero al declarar la variable.

Desreferencia de dos punteros cuando se usa fuera de la declaración.

40

En una declaración, que significa que es un puntero a un puntero:

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

Al usarlo, deferencias dos veces:

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

¿Y si establecieras z a 2 usando solo un punto * z = 2? – numerical25

+3

@num Cambiaría y para apuntar a la ubicación de la memoria 2, y '* y = 1;' o '** z = 1;' intentarían cambiar la memoria en la dirección 2, lo que es casi seguro fuera de la ubicación legal rango que le han asignado –

1

Es un puntero a un puntero. Puede usar esto si desea apuntar a un array, o un const char * (cadena). Además, en Objective-C con Cocoa esto a menudo se usa para apuntar a un NSError*.

2

** variable es doble desreferencia. Si la variable es una dirección de una dirección, la expresión resultante será el valor l en la dirección almacenada en la variable *.

puede significar cosas diferentes si se trata de una parte de la declaración:

tipo ** variables significaría, por el contrario, un puntero a un puntero, es decir, una variable que puede contener la dirección de otra variable , que también es un puntero, pero esta vez a una variable del tipo 'tipo'

2

Significa que la variable se desreferencia dos veces. Supongamos que tiene un puntero a un puntero a char así:

char ** variable = ...;

Si desea acceder al valor de este puntero está apuntando a, usted tiene que eliminar la referencia dos veces:

** variable de

4

Se puede utilizar para explicar cdecl C-tipos.

Hay una interfaz en línea aquí: http://cdecl.org/. Ingrese "int ** x" en el campo de texto y verifique el resultado.

1

puntero a otro puntero

+1

Si hace una pregunta tan básica, probablemente también necesite explicar el concepto de un puntero. – agf

1

** es un puntero a un puntero. A veces se usan para arreglos de cadenas.

0

es un puntero al puntero ,. como en el caso de x * significa que contendrá una dirección de alguna variable que si digo m = x & que m se muestra como int ** m