/ / Adición en la matriz de char - c ++, c

Adición en la matriz de char - c ++, c

Esta es probablemente una pregunta estúpida. Jugar con C ++ y encontrar esta línea de código que me hace un poco confundido

char buffer[7] = {"0", "1", "0", "9", "0", "1"};

// It prints 010901
printf("%s", buffer);

// It prints 0901
printf("%s", buffer+2);

¿Por qué podemos (+2) la variable del buffer y es como cambiar 2 caracteres a la derecha?

Respuestas

6 para la respuesta № 1

En un contexto como ese, el nombre de la matriz buffer "degrada" a ser solo un puntero al primer valor. Como C y C ++ admiten la aritmética del puntero, y las cadenas se representan como punteros a las matrices de caracteres, está bien.

Tenga en cuenta la terminación "" carácter, que está implícito ya que especifica un tamaño mayor del que proporciona los datos de inicialización.

Aún así, su código se puede simplificar a:

const char buffer[] = "010901";

Puedes visualizarlo así:

               +-----+-----+-----+-----+-----+-----+-----+
buffer ------> | "0" | "1" | "0" | "9" | "0" | "1" | " |
+-----+-----+-----+-----+-----+-----+-----+
^
|
|
buffer + 2

1 para la respuesta № 2

Las expresiones del tipo de matriz a menudo pasan por una conversión de matriz a punta. Básicamente, el nombre buffer aquí se puede convertir a un puntero a su primer elemento. Eso es lo que sucede en ambos casos. La matriz se convierte en char* y entonces printf interpreta eso como señalar al primer personaje en una cadena estilo C.

En el segundo caso, después de la conversión a un puntero, está agregando 2 a ese puntero. Esto le da un puntero al tercer elemento. printf de nuevo trata esto como una cadena de estilo C, pero a partir del tercer carácter de la matriz que ha creado.

Al principio pensé que tenías un problema consu cadena no tiene terminación nula. Sin embargo, su código está bien porque la matriz es del tamaño 7 y el último elemento se establecerá en 0 porque no especifica un inicializador para él. Sin embargo, esto es confuso. Te recomiendo que en su lugar declares tu matriz así:

char buffer[] = "010901";

0 para la respuesta № 3

C ++ define una matriz implícita a punteroconversión; es decir, una matriz es implícitamente convertible a un puntero a su primer elemento (elemento con índice 0). Esto significa que su código es básicamente interpretado así:

printf("%s", (&buffer[0]) + 2);

0 para la respuesta № 4

¡Tienes que terminar esa cadena, hermano!

char buffer[7] = {"0", "1", "0", "9", "0", "1", ""};

// It prints 010901
printf("%s", buffer);

// It prints 0901
printf("%s", buffer+2);

0 para la respuesta № 5
char buffer[7] = {"0", "1", "0", "9", "0", "1" , ""};

Un nombre de matriz en C es básicamente también un puntero a la ubicación de la matriz

buffer[i] se traduce como *(buffer+i) es decir, agregar i al valor del puntero [sigue la aritmética del puntero]. Entonces, da la dirección en esa ubicación. printf imprimirá un %s hasta que encuentre un n. Por lo tanto, la salida.

Comprobar esta saber sobre punteros y matrices