sirven que punteros puntero parametros para los funciones ejemplos declaracion como cadenas arreglos aritmetica c arrays pointers

que - punteros en c ejemplos



¿Por qué un puntero a un puntero es incompatible con un puntero a una matriz? (3)

From what I understand, ''s'' is a pointer to the first element of the array
No, s es una matriz. Se puede reducir a un puntero a una matriz, pero hasta ese momento, es una matriz. Un puntero a una matriz se convierte en un puntero al primer elemento de la matriz. (Sí, es un poco confuso)

char (*p1)[] = &s; Esto está permitido, es un puntero a una matriz, asignada la dirección de una matriz. Señala el primer elemento de s.

char **p2 = &s;
Eso hace un puntero a un puntero y le asigna la dirección de la matriz. Le asigna un puntero al primer elemento de s (una char ), cuando cree que es un puntero a un puntero a uno o más caracteres. Desreferenciar esto es un comportamiento indefinido. (segfault en su caso)

La prueba de que son diferentes se encuentra en sizeof(char[1000]) (devuelve un tamaño de 1000 caracteres, no el tamaño de un puntero) y funciones como esta:

template<int length> void function(char (&arr)[length]) {}

que se compilará cuando se le dé una matriz, pero no un puntero.

Está bien, tengo problemas para entender los punteros a los punteros y los punteros a las matrices. Considera el siguiente código:

char s[] = "Hello, World"; char (*p1)[] = &s; char **p2 = &s; printf("%c/n", **p1); /* Works */ printf("%c/n", **p2); /* Segmentation fault */

¿Por qué funciona la primera impresión, mientras que la segunda no?

Por lo que entiendo, ''s'' es un puntero al primer elemento de la matriz (es decir, ''H''). Entonces, declarar p2 como char ** significa que es un puntero a un puntero a un char. Hacer que apunte a ''s'' debería ser legal, ya que ''s'' es un puntero a un char. Y así desreferenciarlo (es decir, ** p2) debería dar ''H''. ¡Pero no es así!


Su malentendido yace en lo que es. No es un puntero: es una matriz.

Ahora, en la mayoría de los contextos, s evalúa como un puntero al primer elemento de la matriz: equivalente a &s[0] , un puntero a esa ''H'' . Sin embargo, lo importante aquí es que el valor del puntero que obtienes al evaluar s es un valor temporal y efímero, al igual que &s[0] .

Debido a que ese puntero no es un objeto permanente (en realidad no es lo que está almacenado en s ), no puede hacer que un puntero a puntero apunte a él. Para utilizar un puntero a puntero, debe tener un objeto puntero real para señalar; por ejemplo, lo siguiente es correcto:

char *p = s; char **p2 = &p;

Si evalúa *p2 , le está diciendo al compilador que cargue lo que señala p2 y lo trate como un puntero a char. Eso está bien cuando p2 realmente apunta a un puntero a char; pero cuando haces char **p2 = &s; , lo que apunta p2 no es un puntero en absoluto: es una matriz (en este caso, es un bloque de 13 caracteres).


Aquí está la muestra que funciona, más impresiones de direcciones de puntero para que las cosas sean más simples de ver:

#include <stdio.h> char s[] = "Hello, World"; char (*p1)[] = &s; char *p2 = (char*)&s; int main(void) { printf("%x %x %x/n", s, p2, *p2); printf("%x/n", &s); // Note that `s` and `&s` give the same value printf("%x/n", &s[0]); printf("%c/n", **p1); printf("%c/n", *p2); }