[C con Clase] Caracteres..?

Salvador Pozo salvador en conclase.net
Jue Nov 23 20:25:26 CET 2006


El pasado 2006-11-23 14:38:03, ymabreu escribió:
 
Hola:

A tu segunda pregunta, te diré que las cadenas en C y C++ se terminan siempre con un carácter nulo.

En tu ejemplo, declaras:

char numero[10]="hola";

Eso significa que tienes una variable "numero" que puede contener, como máximo, 10 caracteres.

Si lo declaras de esa forma, en la primera posición se almacena el carácter 'h', en la segunda 'o', en la tercera 'l', en la cuarta 'a' y en la quinta un nulo. 

El carácter nulo es un cero del tipo char. Esta constante se puede escribir en los programas como el número cero, ya que char es un tipo numérico, aunque esos números se usen para codificar caracteres. También se pueden usar constantes simbólicas o valores como '\0' ó 0x00.

Cuando quieras mostrar el contenido de la cadena no debes hacer un simpre bucle de 0 a 9, sino que además debes detener el bucle cuando se detecte un carácter nulo:

for(i = 0; i < 10 && numero[i] != 0; i++)  mostrar(numero[i]);

Esto se puede simplificar teniendo en cuenta que cualquier expresión distinta de cero es verdadera:

for(i = 0; i < 10 && numero[i]; i++)  mostrar(numero[i]);

En cuanto a la otra pregunta:

y> Tengo otra duda: existe alguna forma de pasarle un parámetro desde una funcion1  a una funcion2 de forma tal que al este ser modificado en la funcion2 salga a funcion1 modificado? tener en cuenta que el parámetro no está declarado de forma global ni la funcion2 devuelve ese nuevo valor. Según entiendo en pascal se puede hacer algo parecido en dependencia de como se declare la variable que recibe los datos en funcion2, hago la aclaración para que se me entienda mejor.

Sí, a eso se le llama pasar parámetros por referencia. En C se usan punteros para eso, en C++ se pueden usar punteros (y en general es recomendable hacerlo), o se pueden usar referencias.

En el curso de nuestra página, ese tema se trata en el capítulo 15:

http://c.conclase.net/curso/index.php?cap=015

Una referencia es un nombre alternativo para una variable. Podemos crear referencias en nuestros programas siempre que queramos. En esos casos, tanto la variable original como la referencia se refieren (valga la redundancia) a la misma variable. Los cambios en una se producen en ambas, ya que de hecho, las dos se refieren a las mismas posiciones de memoria.

En una función, un parámetro que sea una referencia hace lo mismo, el parámetro pasado no será un valor, sino una variable con la misma dirección de memoria y el mismo tipo que la variable pasada como parámetro:

void funcion(int &ref) {
  ref++;
}

En este caso, si llamamos de este modo:

int x = 10;
funcion(x);

El valor de x habrá cambiado después de la llamada, ya que en la función, el parámetro ref es una referencia a x, es decir, ref y x se refieren a la misma variable.

Con punteros se puede hacer algo similar, y de hecho, hablando de forma estricta, las referencias no están pensadas para usarse como te he explicado.

Al usar punteros es más evidente que el valor de la variable referenciada puede ser modificado por la función, y el programador, generalmente, estará prevenido para ese caso.

El mismo ejemplo anterior, usando punteros, quedaría así:

void funcion(int *ref) {
  (*ref)++;
}

Y la llamada:

int x = 10;
funcion(&x);

En esta llamada es evidente que pasamos la dirección de x, y que, al menos en principio, la función puede modificar el valor, ya que posee la dirección de memoria de la variable x.

En el ejemplo anterior esto no está tan claro, ya que en la llamada no queda claro que estamos pasando una referencia, y un programador que use esta función sin consultar su código no puede predecir si el valor de x cambiará o no.

Y por ahora ya me he enrollado suficiente. :-)

Hasta pronto.
-- 
Salvador Pozo
mailto:salvador en conclase.net



Más información sobre la lista de distribución Cconclase