|
|
| (No se muestran 18 ediciones intermedias del mismo usuario) |
| Línea 1: |
Línea 1: |
| = [[Estructuras]] = | | = [[Estructuras]] = |
| = [[Punteros]] = | | = [[Punteros]] = |
| | = [[Memoria Dinámica]] = |
| | = [[Archivos]] = |
| | = [[Variables]] = |
| | = [[PROGMEM]] = |
| | = [[Casting]] = |
| | = Otros = |
| | *casting |
| | *typedf -> cambia nombre del tipo a otro nombre personalizado. Ej. typedef strcut contacto contacto_t; //Ahora escribiendo contacto_t estoy escribiendo en realidad struct contacto. |
|
| |
|
| = Variables = | | = Documentación = |
| unsigned signed uint8_t byte int long char
| | [http://www.infor.uva.es/~belar/Ampliacion/Curso%202008_2009/Punteros_en_C.pdf Punteros en C]<br/> |
| | | [http://www.zator.com/Cpp/index.htm Curso de C++ - Zator System ]<br/> |
| = Punteros =
| | [http://c.conclase.net/curso/?cap=011#inicio Curso de C++ con clase]<br/> |
| *Un puntero no es más que una variable estática cuyo contenido es una dirección de memoria
| | [http://www.elrincondelc.com/cursoc/cursoc14.html Curso de C - El Rincón de C]<br/> |
| *Para obtener la dirección de memoria de una variable se usa el operador de dirección"&"
| | [http://www.codeproject.com/Articles/6555/To-new-is-C-To-malloc-is-C-To-mix-them-is-sin Diferencias entre Malloc, Realloc, ... y New, Delete]<br/> |
| int i;
| | [http://www.angelfire.com/my/jimena/estructuras/archivos.html angelfire.com]<br/> |
| printf("direccion de memoria de la variable: %d", &i);
| | [http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Manejo_de_archivos Wikilibros - Programación en C]<br/> |
| | | [http://www.cursomicros.com/avr/lenguaje-c/lenguajec.html cursomicros.com - Lenguaje C para Microcontroladores]<br/> |
| *Para acceder al contenido de una posición de memoria se utiliza el operador de indirección "*"
| |
| *Cuando se define un puntero se hace según un tipo de variable. Ese puntero solo puede apuntar a ese tipo de varaibles
| |
| *Los operadores "& y *" tiene mas prioridad que los operadores binarios (+, -, ...)
| |
| *Se pueden asignar punteros entre ellos:
| |
| int a = 8;
| |
| int *p = &a;
| |
| int *q;
| |
| q = p;
| |
| | |
| == Operaciones con Vectores ==
| |
| *Podemos manipular la dirección de memoria del puntero
| |
| <pre>
| |
| int *p;
| |
| int a[10];
| |
| | |
| p=&a;
| |
| printf("%d", *(p+0)); //Primera posicion del vector a ;
| |
| printf("%d", *(p+1)); //Segunda posicion del vector a;
| |
| </pre>
| |
| | |
| *Lo mismo se puede hacer restando
| |
| == Punteros y Vectores ==
| |
| '''Todos los vectores son en realidad punteros'''
| |
| <pre> | |
| int a[10];
| |
| int *p;
| |
| | |
| p = a; //Ahora p puede acceder a las "casillas de a". Se escribe así porque la variable a, es un puntero
| |
| | |
| //Estos dos printfs son equivalentes
| |
| printf("%d", a[0]);
| |
| printf("%d", *p);
| |
| | |
| //Estos dos printfs son equivalentes
| |
| printf("%d", a[1]);
| |
| printf("%d", *(p+1)); //Sumamos 1 a la dirección de memoria haciendo que p apunte al siguiente elemento del vector
| |
| | |
| //En este ejemplo vemos que para imprimir un caracter y asignarle un valor lo hacemos normalmente:
| |
| char *c;
| |
| char b = 'H';
| |
| c = &b;
| |
| printf("%c", *c); //Cuando se imprime se pone el * para imprimir el dato que hay en la casilla a la cual apunta c.
| |
| | |
| //Aqui vemos que en una cadena de caracteres las operaciones de imprimir y asignar un valor son diferentes a como se hacen con el caracter y son similares a como se hacen con vectores de cadenas.
| |
| //Esto es por lo dicho anteriormente, los vectores de cadena son punteros.
| |
| //Estos dos ejemplos son equivalentes, los dos imprimiran Fran
| |
| char *cadena;
| |
| cadena = "Fran";
| |
| printf("%s", cadena);
| |
| | |
| char cadena2[]="Fran";
| |
| printg("%s", cadena2);
| |
| | |
| //Printfs equivalentes. Estos dos imprimiran F
| |
| char cadena[]="Fran";
| |
| printf("%c", cadena[0]);
| |
| printf("%c", *cadena);
| |
| </pre> | |
| | |
| Explicación:
| |
| Ejemplo1 Ejemplo2
| |
| char cadena2[]="Fran"; == char *cadena = "Fran";
| |
| printf("%s", cadena2); == printf("%s", cadena);
| |
| | |
| Con estos dos ejemplos vemos que cuando se hace la declaracion de una cadena de caracteres y luego se imprime es igual que como se hace con un puntero.<br/>
| |
| Cuando se imprime un puntero que apunta a un vector lo que se imprime es la primera posicion del vector. Para poder ir recorriendo el vector se le va sumando +1 al contenido de la memoria, asi si va desplazando entre las casillas.<br/>
| |
| Por tanto cuando ponemos en el printf la cadena lo que hacemos es pasarle al printf la dirección de memoria y con el operador %s indicamos que es un vector de caracteres y que tiene que ir recorriendolo todo.
| |
| | |
| Sabiendo esto y sabiendo de operaciones de punteros podemos hacer las equivalencias:
| |
| <pre>
| |
| char cadena="Fran";
| |
| printf("%c", cadena[0]) == printf("%c", *cadena); //Primera posicion del vector
| |
| printf("%c", cadena[1]) == printf("%c", *(cadena+1); //Segunda posicion del vector
| |
| </pre> | |
| | |
| == Documentación ==
| |
| [http://www.infor.uva.es/~belar/Ampliacion/Curso%202008_2009/Punteros_en_C.pdf Punteros en C] | |
| | |
| = Otros =
| |
| typedf -> cambia nombre del tipo a otro nombre personalizado. Ej. typedef strcut contacto contacto_t; //Ahora escribiendo contacto_t estoy escribiendo en realidad struct contacto.
| |