¿Cuál es la diferencia entre "char * A []" y "char ** A" en lenguaje C?


Respuesta 1:

char * a [] es una matriz de punteros para variables de tipo char, mientras que char ** a define un puntero a una variable puntero de variable de tipo char.

por ej.

char c = 'a'; // valor de c = 2

char * p = & c;

// el puntero p apunta a la variable c

char ** pp = & p;

// pp apunta al puntero p que apunta a la variable c

Para obtener más información, consulte la URL: http: //www.thegeekstuff.com/2012 ...


Respuesta 2:

char * A [] es una matriz y char ** A es un puntero. En C, la matriz y el puntero a menudo son intercambiables, pero hay algunas diferencias:

1. con "char * A []", no puede asignar ningún valor a A, sino solo A [x];

con "char ** A", puede asignar valor a A y A [x] también.

2. con "char * A []", puede inicializar una matriz (por ejemplo, char * A [] = {"foo", "bar"};) y usar sizeof (A) para obtener el tamaño (en 64 bits máquina, el ejemplo anterior te da 16 porque es una matriz de dos caracteres *);

con "char ** A", sizeof (A) siempre devuelve el tamaño de un puntero (en una máquina de 64 bits, 8).


Respuesta 3:
  1. char * A [] significa "una matriz de punteros a caracteres", mientras que char ** A significa "un puntero a un puntero a un char". Tenga en cuenta que el primero le dice explícitamente que estamos trabajando con una matriz, mientras que el segundo no ofrece dicha garantía. Sin embargo, por construcción, ambos son equivalentes a C porque una matriz se almacena como un puntero al primer elemento en esa matriz. Una matriz de punteros es una instancia especial de un puntero a un puntero; un puntero a un puntero no es necesariamente una matriz de punteros. Para demostrar esto, tenga en cuenta que, para una matriz de puntero arrp, puede asignar char ** A = (char **) (void *) arrp, pero no puede (es decir, arroja un error del compilador) char * A [] = ( char * []) ​​(nulo * []) ​​arrp; - de hecho, no puede crear instancias y matrices sin darle un argumento de longitud, y tampoco puede convertir a matrices, solo punteros

Respuesta 4:

El primero es un puntero [1] a su primer elemento (también conocido como matriz), el segundo puede ser el tipo de puntero a una matriz de cadenas de caracteres [2], por ejemplo.

En otras palabras, las matrices se desintegran en punteros de todos modos y, por lo tanto, son simplemente un azúcar sintáctico (siempre que pase por alto las solicitudes de asignación de tamaño en caso de matrices)

[1] A diferencia de int *, char * es un tipo de puntero universal.

[1] las cadenas se pasan como matrices terminadas en nulo, ellas mismas.

Para más ejemplos ver

La respuesta de Ken Gregg a ¿Cuándo debería definir punteros dobles en argv- en el programa principal de C como argumento?

La respuesta de Sergey Zubkov a ¿Son posibles las matrices de matrices en C?

La respuesta de John L. Miller a ¿Son posibles las matrices de matrices en C?