2009-12-19 6 views
7

Estoy aprendiendo acerca de las cadenas en C ahora.¿Por qué Scanf no necesita un ampersand para cadenas y también funciona bien en printf (en C)?

¿Cómo es que para usar scanf para obtener una cadena que puede hacer

scanf("%s",str1); 

y para printf que puede hacer

printf("The string is %s\n", str1); 

Entiendo que para scanf es debido a que la cadena es sólo un personaje array, que es un puntero, pero para printf, ¿cómo es que puedes simplemente poner el nombre de la variable como lo harías con un int o float?

Respuesta

10

scanf necesita la dirección de la variable para leer, y los búferes de cadena ya están representados como direcciones (puntero a una ubicación en la memoria, o una matriz que se descompone en un puntero).

printf hace lo mismo, tratando %s como un puntero a cadena.

5

En C, las variables que son matrices se convierten en un puntero al primer elemento de la matriz cuando se utilizan como argumentos de función, por lo que su scanf() ve un puntero a la memoria (suponiendo que "str1" es una matriz).

En su printf(), "str1" podría ser un puntero a una cadena o una matriz de caracteres (en cuyo caso, el argumento visto por printf() sería un puntero al primer elemento de la matriz).

+0

Más precisamente, una expresión del tipo de matriz se convierte implícitamente ("decae") en un puntero al primer elemento de la matriz en la mayoría, pero no en todos los contextos. Un argumento de función pasa a ser uno de los contextos donde ocurre la conversión. –

Cuestiones relacionadas