tutorialspoint significado punteros perros meaning dogs array c++ pointers

significado - ¿Qué es** en C++?



punteros c++ (11)

He visto algunos códigos, así como algunos errores generados por mi compilador que tienen un token '' ** '' antes de la variable (por ejemplo, ** nombre de la variable sin referencia-- o algo así, no puedo recordar exactamente de improviso). Estoy bastante seguro de que esto está relacionado con los punteros, si tuviera que adivinar parece que está intentando desviar dos veces. '' ** '' es bastante ingociable. ¿Puede alguien indicarme un buen sitio web / documentación o alguien se preocuparía de explicarlo aquí?

Gracias.

Grandes respuestas. Si puedo agregar, ¿cuáles serían algunas situaciones en las que es útil tener un puntero a un puntero? ¿No debería estar utilizando el puntero original en lugar de crear otro puntero al puntero original?


** es un puntero a un puntero.

Puede ser una matriz (una matriz de matrices) o una matriz de cadenas (una matriz de caracteres), etc.


** no es en realidad solo un puntero al puntero (como en la declaración), sino que también es la desreferencia de una desreferencia (en una declaración).

Se usa a menudo en C que no tiene la notación & para referencias, por ejemplo, para actualizar un valor de retorno que es un tipo de puntero:

int alloc_foo(struct foo **foo_ret) { *foo_ret = malloc(sizeof(struct foo)); return 1; /* to indicate success; return value in foo_ret */ }


Es una doble desreferencia.

int i = 3; int* ptr_to_i = &i; int** ptr_to_ptr_to_i = &ptr_to_i; std::cout << **ptr_to_ptr_to_i << std::endl;

Imprime 3.


Es uno de los allures de C ++ Sigils. Desde mi propia experiencia personal, puedo garantizar un rendimiento de acceso a la lectura más rápido y eficiente utilizando operadores de referencia en los arrays y vectores de STL. También he adoptado los métodos habituales de punteros compartidos si tienes curiosidad. :)


No es un ** token. Es simplemente un * token seguido de otro * token. En su caso, tiene un puntero a un puntero, y está siendo desreferenciado dos veces para obtener lo que realmente se está apuntando.



Puede reconocer la firma para main ():

int main(int argc, char* argv[])

Lo siguiente es equivalente:

int main(int argc, char** argv)

En este caso, argv es un puntero a una matriz de char *.

En C, el operador de índice [] es solo otra forma de realizar la aritmética del puntero. Por ejemplo,

foo[i]

produce el mismo código que

*(foo + i)


Solo quería subrayar algunos de los usos de un puntero a un puntero. La mayoría de estos son abordados por otros mensajes, pero pensé que la reiteración podría ayudar.

  • Permite a un destinatario de la llamada modificar un puntero propiedad de la persona que llama. Por ejemplo, uno podría pasar un puntero a un puntero al comienzo de una cadena, y el destinatario podría modificar el puntero apuntado para ahora apuntar a una posición dentro de la cadena donde ocurre un carácter particular.

  • Debido a que las matrices se degradan a punteros (y los punteros pueden tratarse como matrices), a menudo verá un puntero a un puntero si tiene:

    • Un puntero a una matriz. Esta es una generalización del caso anterior, ya que una "cadena" (una cadena de estilo C, de todos modos) es realmente solo una matriz de caracteres.

    • Una variedad de punteros. Puede, por ejemplo, tener una serie de punteros a objetos, lo que permite el polimorfismo, o una matriz de punteros para seleccionar objetos almacenados en otra colección.

    • Una matriz de matrices. De nuevo, las matrices se degradan a punteros, por lo que este es un caso específico de los anteriores. Esto se usa a menudo para las llamadas matrices "irregulares" (en oposición a las rectangulares).


Un uso común es que permite que una función establezca el puntero a nulo.
Por lo tanto, el puntero (libre) libera la memoria asignada al puntero pero deja el puntero apuntando peligrosamente a la memoria libre.
En su lugar, declare my_free (** puntero) y llame a my_free (& puntero) para que my_free () pueda establecer el puntero a null después de liberarlo.



  • int **var declara un puntero a un puntero
  • **var referencia al contenido de un puntero, que en sí mismo apunta a un puntero