sirven que punteros parametros para los funciones estructura ejemplos dobles declaracion datos como cadenas aritmetica apuntadores c string pointers

que - ¿Por qué puedo usar punteros como cadenas cuando se declaran con comillas dobles, pero no llaves, en C?



punteros como parametros de funciones en c (2)

En este caso, pCow se establece en la dirección de una cadena en c en la memoria estática:

char *pCow = "pCow goes MOO";

En este caso, pCow se establece en el valor ''p'' (es decir, 112 ):

char *pCow = {''p'',''C'',''o'',''w'','' '',''g'',''o'',''e'',''s'','' '',''M'',''O'',''O'',''/0''};

Como la dirección 112 probablemente apunta a la memoria restringida / inválida, su programa explotará cuando intente acceder a pCow[counter] .

La advertencia "exceso de elementos en el inicializador escalar" le indica que está ignorando todas las cosas después de la ''p'' ya que el puntero solo necesita un valor.

La advertencia "initialization makes puntero from integer without a cast" te dice que estás usando ''p'' como puntero, lo que probablemente no sea una buena idea ...

Lo que quiere hacer es declarar pCow como una matriz de caracteres en lugar de un puntero de caracteres si desea usar la sintaxis del inicializador:

char pCow[] = {''p'',''C'',''o'',''w'','' '',''g'',''o'',''e'',''s'','' '',''M'',''O'',''O'',''/0''};

Si declaro y uso un puntero como este:

int counter; char *pCow = "pCow goes MOO"; for(counter = 0; counter < 14; counter++) printf("%c", pCow[counter]);

muestra toda la cadena y funciona, y sí, y hay mucho regocijo.

Sin embargo, si uso un inicializador como este:

int counter; char *pCow = {''p'',''C'',''o'',''w'','' '',''g'',''o'',''e'',''s'','' '',''M'',''O'',''O'',''/0''}; for(counter = 0; counter < 14; counter++) printf("%c", pCow[counter]);

¡el programa se cuelga y pCow se rehúsa a mugir por mi placer hedonista!

3 Warnings. 0 Errors line 11 (near initialization for ''pCow'') [enabled by default] C/C++ Problem line 11 excess elements in scalar initializer [enabled by default] C/C++ Problem line 11 initialization makes pointer from integer without a cast [enabled by default] C/C++ Problem

Lovingly probado en Eclipse CDT.


"pCow goes MOO" es un literal de cadena y tiene dos usos diferentes. O puede usarlo como iniciador de una matriz:

char aCow[] = "pCow goes MOO";

En cuyo caso, los contenidos del literal de cadena se copian en la matriz.

O, como alternativa, puede usar un literal de cadena como una matriz constante independiente en cualquier parte de su programa. Por ejemplo strcpy(cow, "pCow goes MOO"); . Entonces, hay una diferencia distintiva entre estos dos:

char aCow[] = "pCow goes MOO"; char* pCow = "pCow goes MOO";

En el primer caso, el literal se copia en la matriz. En el segundo caso, el literal permanece como una constante independiente en la memoria de solo lectura, que señalamos con un puntero. El primero puede ser modificado, el último no puede.

En cuanto al caso de

char *pCow = {''p'',''C'',''o'',''w'','' '',''g'',''o'',''e'',''s'','' '',''M'',''O'',''O'',''/0''};

Está utilizando un puntero, pero no tiene una cadena literal. En su lugar, tiene una lista de inicializadores destinada a una matriz. Un buen compilador te advertiría sobre el "exceso de inicializador". La razón por la cual el código se compila es una regla muy extraña en C que permite que las variables planas se inicialicen con llaves, por ejemplo int x = {1}; . Entonces el compilador usa esta regla para inicializar su puntero para apuntar a la dirección ''p'' , que por supuesto no tiene sentido, y luego descarta el resto de la lista de inicializadores.