Gestión de Memoria Dinámica y Matrices en C++: Punteros, Arreglos y Ordenamiento
Gestión de memoria dinámica y matrices en C++
A continuación se presentan fragmentos de código en C++ que ilustran el uso de punteros, la reserva y liberación de memoria dinámica con new y delete, el manejo de matrices y el ordenamiento de arreglos de caracteres.
1. Punteros y reserva de memoria dinámica
int* p = new int; // Reserva memoria para un entero
*p = 10; // Asigna un valor
delete p;
int* arr = new int[10]; // Reserva espacio para 10 enteros
arr[0] = 5;
delete[] arr;
2. Impresión de una fila de una matriz
La función impriFila recorre de forma recursiva los elementos de una fila:
void imprimirFila(int* p, int columnas, int restantes) {
if (restantes == 0) return;
cout << *p << "\t";
imprimirFila(p + 1, columnas, restantes - 1);
}
3. Impresión recursiva de una matriz
void imprimirMatriz(int* p, int filas, int columnas, int filaActual = 0) {
if (filaActual == filas) return;
imprimirFila(p + filaActual * columnas, columnas, columnas);
cout << endl;
imprimirMatriz(p, filas, columnas, filaActual + 1);
}
4. Matriz dinámica de punteros
int** mat = new int*[filas]; // Reserva memoria para las filas
for (int i = 0; i < filas; i++) {
mat[i] = new int[columnas]; // Reserva columnas para cada fila
}
for (int i = 0; i < filas; i++) {
delete[] mat[i];
}
delete[] mat;
5. Programa principal de ejemplo
int main() {
int filas = 3, columnas = 4;
int matriz[3][4];
imprimirMatriz(&matriz[0][0], filas, columnas);
return 0;
}
6. Conceptos clave de punteros
- Declaración:
int* p;declara un puntero. - Asignación:
p = &x;guarda la dirección de memoria dex. - Acceso y modificación:
*ppermite acceder o modificar el valor almacenado. - Aritmética de punteros:
p++mueve el puntero al siguiente elemento. - Acceso por desplazamiento:
*(p + i)accede al valor situadoiposiciones adelante. - Acceso a matrices:
*(*(m + i) + j)equivale am[i][j].
7. Llenado de una matriz de caracteres
La función llenarMatriz genera caracteres aleatorios en tres categorías: minúsculas, mayúsculas y números, guardándolos en arreglos auxiliares para su posterior ordenamiento.
void llenarMatriz(char m[8][8], char min[], int &cMin, char may[], int &cMay, char num[], int &cNum) {
cMin = cMay = cNum = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
int tipo = rand() % 3;
if (tipo == 0) {
m[i][j] = 'a' + rand() % 26;
min[cMin++] = m[i][j];
} else if (tipo == 1) {
m[i][j] = 'A' + rand() % 26;
may[cMay++] = m[i][j];
} else {
m[i][j] = '0' + rand() % 10;
num[cNum++] = m[i][j];
}
}
}
}
8. Mostrar la matriz de caracteres
void mostrarMatriz(char m[8][8]) {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++)
cout << m[i][j] << " ";
cout << endl;
}
}
9. Algoritmos de ordenamiento
Ordenamiento ascendente:
void ordenAsc(char v[], int n) {
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (v[i] > v[j]) swap(v[i], v[j]);
}
Ordenamiento descendente:
void ordenDesc(char v[], int n) {
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (v[i] < v[j]) swap(v[i], v[j]);
}
10. Llenado ordenado de la matriz
void llenarOrdenado(char m[8][8], char min[], int cMin, char may[], int cMay, char num[], int cNum) {
// Completar la matriz con los caracteres ya ordenados
mostrarMatriz(m);
}
11. Programa principal completo
int main() {
srand(time(0));
char m[8][8], min[64], may[64], num[64];
int cMin, cMay, cNum;
llenarMatriz(m, min, cMin, may, cMay, num, cNum);
mostrarMatriz(m);
ordenAsc(min, cMin);
ordenDesc(may, cMay);
ordenAsc(num, cNum);
llenarOrdenado(m, min, cMin, may, cMay, num, cNum);
mostrarMatriz(m);
return 0;
}