Punteros y matrices
Es la misma idea que cuando hemos hablado de vectores y punteros.
Una matriz es un puntero al primer elemento más una reserva de espacio para todos los elementos.
¿Cómo se almacenara una matriz en C? Por filas. El orden de los elementos en memoria es el siguiente (suponiendo 3x3):
m[filas][columnas]
m[0][0]
m[0][1]
m[0][2]
m[1][0]
m[1][1]
m[1][2]
m[2][0]
m[2][1]
m[2][2]
¿Puedo hacer esto?
#define FILAS 3
#define COLUMNAS 3
...
int matriz[FILAS][COLUMNAS];
mifuncion(matriz);
...
void mifuncion(int *m){
...
m[1][0]=...
...
}
Respuesta
NO
Motivo: Cuando quiero pasar una matriz como parámetro a una función tengo que pasar además del puntero, las dimensiones de esa matriz ya que el puntero no tiene ninguna información acerca de cuántas columnas tiene la matriz y por tanto no sabe dónde terminan las filas.
Cuando he puesto m[1][0], sintácticamente es correcto, pero el compilador en ese punto como no sabe cómo de larga es una fila (es decir, cuántas columnas tiene la matriz), no tiene ni idea de a qué componente de la matriz tiene que acceder porque no sabe cuánto desplazarse en memoria.
Es decir, existe m[0][0],m[0][1], m[0][2]...¿Y m[0][1000]? ¿o paramos en m[0][29]? Si no sé cómo de larga es una fila, no sé dónde está almacenado en memoria la componente [1][0] y por tanto no puedo acceder así a los elementos guardados en una matriz.
¿Cómo lo hago entonces? Pasasando puntero (m), nmúmero de filas (f) y número de columnas (c).
El acceso a la componente [1][0] se hace como *(m+c*1+0), o como m[c*1+0] (sí, accediendo la matriz como si fuera un vector, menudo lío, je, je. Bienvenidos a C).
ejemplo [0][1] > *(m+c*o+1)
ejemplo [1][2] > *(m+c*1+2)
Paso de matrices como parámetros
#define FILAS 3
#define COLUMNAS 3
...
int matriz[FILAS][COLUMNAS];
mifuncion(matriz, FILAS, COLUMNAS);
...
void mifuncion(int *m, int f, int c){
...
*(m+c*2+1)=...
/* Equivalente a m[2][1] o a m[c*2+1]*/
...
}
Punteros y registros
'->': Operador especial para acceder a los campos de un regitro que es apuntado por un puntero.
Ejemplo de uso:
struct fecha{
int dia;
int mes;
int agno;
};
struct fecha hoy;
struct fecha *phoy;
phoy=&hoy;
/* a continuación, 3 formas de hacer lo mismo: */
hoy.dia=28;
phoy->dia=28;
punteros y cadenas de caracteres
Recordar que en C una cedena de caracteres no es más que un vector de caracteres que termina en '\0' (para indicar donde termina la información útil que hay en ella).
Por tanto las cadenas de caracteres e tratan exactamente igual que los vectores.
Pese a ello hay algunas funciones para hacer las cosas más sencillas (que no es necesario emplear para nada). De ellas las básicas son strcat (concatenar), strcmp (comparar), strcpy (copiar) y strlen (tamaño útil de la cadena). Las demás rara vez se usan.
0 comentarios:
Publicar un comentario