Fecha actual Dom Ago 18, 2019 10:02 am

Diferencia Entre char a[] y char *a

Tecnología para implementar nuestro propio compilador e intérprete de código C.

Usuarios leyendo este tema: Ninguno

Diferencia Entre char a[] y char *a

Notapor ~ » Sab Nov 24, 2018 1:14 pm

A simple vista, las siguientes 2 instrucciones
tienen exactamente el mismo efecto:

Código: Seleccionar todo
char a[]="asdf";

a db "asdf",0
---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
char a[4+1]="asdf";

a db "asdf",0



Código: Seleccionar todo
char *a;

a ww 0
---------------------------------------
---------------------------------------
---------------------------------------
---------------------------------------
char *a="asdf";

a ww _str0_asdf

_str0_asdf db "asdf",0




Pero el primer caso (char a[]) es como una
etiqueta de Ensamblador que apunta inmediatamente
a una cadena de caracteres, y el contenido
del puntero de a[] no se puede cambiar ya que
genera una etiqueta estática.

Mientras que char *a es un wideword que puede
contener una dirección cualquiera, o la dirección
de la cadena que usamos para inicializarla, y
el valor de dicho puntero se puede cambiar, aunque
si tiene una cadena inicializada esta quedará huérfana,
así que para datos meramente constantes es mejor
usar char a[], o para arreglos que sabemos que
siempre tendrán un tamaño específico.


Sin embargo, cuando pasamos cualquiera
de esos tipos (char *a) o (char a[]) como parámetros,
parecerían ser idénticos, porque al pasarlos
solo como (a), eso resultará en que pasemos
la dirección de la cadena a la que apuntan
actualmente, aunque en un caso se trate de
la misma dirección de la variable en cuestión
(char a[], dirección de la variable == dirección de la cadena)
y en el otro se trate del puntero contenido
actualmente por la variable de puntero tipo char
(char *a).


char a[] no contiene una dirección, sino que
apunta a la cadena que le sigue inmediatamente,
como una etiqueta en Ensamblador, así
que no se puede cambiar con algo como
a=NULL porque simplemente apunta
a una dirección estática de una etiqueta.

Además a[] no se puede declarar sin
una variable que le siga o un número entre
los corchetes [] ya que se supone que
es una simple etiqueta que según el estándar de C
tiene que apuntar a un área válida de datos.

En el caso de algo como (char a[4+1])
tenemos la posibilidad de reservar espacio
no inicializado aunque estático.

Sin embargo para ambos casos podemos
modificar elementos individuales en el área
de datos de la variable, por ejemplo:

Código: Seleccionar todo
a[0]=0;

Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Volver a Compilador de C

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 26 invitados


cron