Por partes.
Primero debo indicar que me equivoque con la explicación de la declaración, como dicen en mi rancho: "metí las patas" (las cuatro
).
----
Bueno, vamos a corregir eso. Cuando en la declaración de un array se utiliza una secuencia de caracteres delimitada por comillas dobles, por ejemplo:
char palabra[] = "hola";
Esa secuencia solo es una forma mas corta de indicar una lista de valores y la declaración anterior es equivalente a:
char palabra[] = {'h', 'o', 'l', 'a', '\0'};
En base a ello la declaración en tu programa:
char i = "a";
/* ==> */
char i = {'a', '\0'};
Es un error ya que una lista de valores solo puede utilizarse en la declaración de un agregado (una estructura o array) y la variable "i" no lo es.
----
Por otra parte en expresiones las secuencias de caracteres delimitadas por comillas dobles se conocen como "cadenas literales", estas secuencias se almacenan en algún lugar en memoria, su tipo es array de caracteres y si se trata de modificar una resulta en "comportamiento no definido" (cualquier cosa puede pasar).
Peor todavía, esas cadenas literales cuando se usan en una expresión tienen
usualmente el mismo efecto que los arrays: resultan en la dirección en memoria del primer elemento de este.
Si todo eso te resulta complicado lo siento, el tema de los arrays y punteros es uno de los mas complicados en el lenguaje C.
Un programa demostrando lo anterior es:
#include <stdio.h>
#include <stdlib.h>
#define CAD_EJEMPLO "123456789"
int main(void)
{
int i;
printf("La cadena de ejemplo es \"%s\"\n", CAD_EJEMPLO
);
/* 1) Direccion donde se almacena la cadena literal */
printf("Direccion base: %p\n", (void *) CAD_EJEMPLO
);
/* 2) Espacio utilizado en memoria por la literal */
printf("Espacio utilizado: %lu\n", (unsigned long) sizeof CAD_EJEMPLO
);
/* 3) Literales iguales se almacenan en el mismo lugar? */
if (CAD_EJEMPLO == CAD_EJEMPLO)
else
puts("Distinta ubicacion");
/* 4) Impresion de cada uno de los caracteres de la literal */
for (i = 0; CAD_EJEMPLO[i] != '\0'; i++)
return EXIT_SUCCESS;
}
Un saludo