c es para imprimir un caracter o una sola letra c = char.
s espara imprimir la cadena completa.
Código C:
Ver original#include <stdio.h>
#include <string.h>
/*Salta a una nueva linea pero envés de escribir printf("\n"); escribimos salto*/
#define salto printf("\n");
int main(){
char palabra[] = "palote";
int longitud = ( sizeof palabra );
printf( "%i", longitud
); /* Esto me dice el tamaño de "palabra", gracias a sizeof palabra */ /*
// Como dije antes, %s es de string, y apunta la primera letra de una cadena, sabiendo
// donde esta la primera imprime todas hasta llegar a la \0 o al final de la cadena
// por eso lo de \0
// Si declaras texto[100]; y solo pones "hola" le sobra 96 casillas(95 en realidad por
// la \0), la forma de saber que solo imprima hasta la 'a' de "hola" es por la \0 (cero),
// si no fuera asi sabe Dios lo que contendría en estas casillas, códigos de otros
// programas (números, chars..... etc) que se imprimirían junto con hola y gracias a \0
// sabemos que no se imprime.
// La %c solo recojo una letra y por eso necesitas especificar la posición donde la vas
// encajar
// ahora ponemos a prueba la letra \0 (cero) a ver si es verdad que esta ahí:
// palote tiene 6 letras ¿No?
// y se puede comprobar haciendo esto:
*/
salto
printf( "Tamanio de la cadena: %i bytes\n", sizeof palabra
); /*Esto lo mismo que lo anterior*/
/*
// aquí consta que tiene un tamaño de 7 Pero un momento hemos dicho que tenia 6 XD
// a ver que hay ahí en la posición 7
*/
salto
char letra = (char)palabra [6]; // como inicia en 0 la 7º posición es el 6 ¿No?
/*
// Imprimimos como un entero ya que de otro modo no se mostraría XD
// Aqui imprimimos palabra[6] y como entero nos va a dar 0 (cero)
*/
/*
// ¿Por que imprimir como entero? Prueba a imprimirle como %c y no te va salir nada.
// Se puede comprobar los resultados con la tabla ASCII y ver realmente lo que contiene.
// 0 es igual que NULL en c por eso no se muestra como char, si le mostramos como int
// al ser igual a cero como int si le podemos ver un (cero), ni todos los caracteres de
// la tabla son imprimibles.
// Aqui te dejo una tabla para comprobar http://www.elcodigoascii.com.ar/
// el primer numero de la tabla es el nul y no lo puedes imprimir como char, eso no
// quiere decir que no este ahi, pero si lo puedes imprimir como int ;)
// fiate en la potencia de c que incluso podemos imprimir una casa que ni esta dentro
// del rango
// Esto: char palabra[] = "palote"; Equivale a crear esto: char palabra[7] y meterle
// "palote0"
// pero puedo muy bien imprimir los datos de que tengan a continuación como palabra[100] XD
// Eso quiere decir que imprime la casilla 100 a partir de la dirección de la primera letra
// que es 'p'. Vamos ha comprobar, pero una cosa es tener claro, como dije antes algunos
// caracteres no son imprimibles por eso imprimimos como int y comprobamos en la tabla ;)
// Tampoco sabemos que es lo que contiene estas casillas si son int o chars :D, pero todas
// las que pueden ser imprimibles lo hacen como int.
// por ejemplo \n que hace salto de linea no es un carácter, mas bien es un símbolo que
// que dice que cuando llegue ahí salte a una nueva linea ¿ok?(Pero esta ahí, siempre hay
// algo aun que sea nulo(cero))
// Basta de chacharas y pongamos a prueba. No se lo que te va salir por que como dije
// esta en la memoria de tu ordenador, cada vez que enciendes, borras, escribes, inicias
// un programa... la memoria cambia así que es impredecible saber lo que contiene ahí :(
*/
salto
printf( "Aqui imprimimos una casilla fuera de rango: %i", palabra
[1000] ); /*
// En la posición 1000 me imprimió la letra U mayúscula según la tabla XD.
// Vayan cambiando el numero muchos salen como NULL o no salen por no ser imprimibles XD
// No se si os habéis dado cuenta la potencia que tiene esto, no me salta ningún error
// y puedo tanto cambiar como leer cualquier parte de una memoria XD
// Chicos cuidado con eso, es una arma de doble filo, si modifico un dato que no
// corresponde puedo poner en peligro todo el sistema operativo XDD
// Ahora juguemos un poco mas, vamos a ver cualquier parte de la memoria :D
*/
salto
/* poniendo el valor aquí en hexdecimal podemos ver cualquier posición de la memoria */
char *puntero=(char*)0x402004;
}
Bueno no se todo sobre memoria, pero la memoria es algo imaginable.
Piénsalo así: la memoria es un almacén, las casillas son cajas numeradas consecutivamente.
En ese almacén entra mas gente a poner cosas en las cajas aparte de ti.
En ese almacén no podemos meter todo lo que queramos en una sola caja, pero podemos distribuir entre varias cajas.
si tengo 5 melones los divido entre cajas, puedo reservar la cantidad de cajas que me apetezca para guardar melones el limite lo pone el sistema operativo. leer sobre "la pila". En la memoria heap puedo reservar muuuuuuucha memoria, tanto como no ayas sido tacaño en comprar XD.
No tendría lógica tener que llenar de melones todas las cajas que reserve, pongo los melones que tengo y cuando termine pongo un aviso que en esa caja ya no tengo mas melones (\0) pero mis cajas siguen ahí reservadas por si despues meto melones o platanos o otra cosa XD.
No tengo que llevar las cajas de melones para vender, modificar, ni nada por el estilo. Imagine que envés de llevar la caja apunto en un papel donde esta esta caja, y cuando me la compran les digo en que numero de caja esta, eso hace los punteros.
los punteros serian en ese almacén una caja que dentro hay un numero que dice donde esta el melón. Si sabes donde esta el puntero sabes donde esta el melón XD
Por supuesto no solo se puede poner melones en una caja, puedo meter fresas(char), plátanos (int) y otras cosas mas.
Si pienso en una caja no voy a saber lo que hay dentro si no lo puse yo, pero nada me impide abrir esta caja. Pero en el caso de la memoria aun abriendo esta caja no sabríamos si el dato es un char o un int o yo que se que mas cosas pueden ser jeje.
Si se que tengo 20 cajas y les metí 10 melones no hay por que abrir todas, el puntero me dice cual es la primera y las voy abriendo, hasta encontrar el aviso \0 (en el caso de las tablas)que me dice, (oye!No sigas que no hay melones XD). Pero si quiero puedo seguir vendendo melones y ya lo has visto que si, aun que eso seria lo mas parecido a un timo. O.o
Ya tengo una diarrea mental con la memoria XD y tanto hablar de melones ya tengo hambre XD
Espero haber aclarado algo, la mejor manera de entender la memoria es jugar con ella, has cosillas. Trabaja con punteros, tablas, direcciones... así te pones un fiera ;)
¡Suerte! A mi esas cosas me hace recordar cosillas que ya lo tenia olvidado ^^
Si me equivoco en algo soy humano, si hay alguna maquina aquí que trabaje algo, que me gusta aprender también XD
PD: leer sobre punteros y entenderás la memoria perfectamente si no lo has echo ya XD