Diferencia Entre char a[] y char *a

Publicar una respuesta


Esta pregunta es una forma de evitar inserciones automatizadas por spambots.
Emoticonos
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :arrow: :| :mrgreen: :geek: :ugeek:
BBCode está habilitado
[img] está habilitado
[flash] está deshabilitado
[url] está habilitado
Emoticonos están habilitados
Revisión de tema
   

Si quieres adjuntar uno o más archivos introduce los detalles debajo

Expandir vista Revisión de tema: Diferencia Entre char a[] y char *a

Diferencia Entre char a[] y char *a

Nota por ~ » 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;


Arriba


cron