|
|
| Línea 4: |
Línea 4: |
| = Variables = | | = Variables = |
| unsigned signed uint8_t byte int long char | | unsigned signed uint8_t byte int long char |
|
| |
| = Punteros =
| |
| *Un puntero no es más que una variable estática cuyo contenido es una dirección de memoria
| |
| *Para obtener la dirección de memoria de una variable se usa el operador de dirección"&"
| |
| int i;
| |
| printf("direccion de memoria de la variable: %d", &i);
| |
|
| |
| *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 = | | = 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. | | 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
unsigned signed uint8_t byte int long char
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.