How a 2D Array works with a double pointer in C

0

How does it work and how can a bidimensional fix be made from a double pointer in C ?

int **a;
    
asked by Gerar Torres 27.09.2018 в 23:53
source

1 answer

0

I can show you an example that may help you:

/*
    Crea una matriz dinámica , la rellena de ceros y 1 en su diagonal.
    Matriz identidad .- Pascual Martínez Cruz

    Modifiqué este código porque estaba incompleto y con cosas innecesarias. -Zeugirdor

    Entre esas cosas, tenía los bucles incompletos y faltaba código necesario para 
    que mostrara la matriz identidad de n filas por n columnas. Además, lo "adapté" 
    a Windows, ya que tenía partes del código muy cortas pero de linux.

    El código tal cual estaba está en esta página, por ahora, online:

    http://m68455pagpersonal.galeon.com/pdoblec.html

*/

#include <stdio.h> 
#include <stdlib.h>
#include <malloc.h> 

int * asignar_matriz(int x); // asigna la memoria de la matriz
void diagonal_matriz(int **array,int x); // rellena de 1s la diagonal
void imprimir_matriz(int **array,int x); // imprime la matriz

void main(void){

    int n; // dimensión de la matriz
    int i,j; // contadores
    int **matriz=NULL; // puntero doble para la matriz dinámica
    system("cls");
    printf("Introduce el tamanyo de la matriz:\n");
    scanf("%d",&n);
    matriz=asignar_matriz(n);
    diagonal_matriz(&*matriz,n); // paso de la matriz a funciones
    imprimir_matriz(&*matriz,n); // paso de la matriz a funciones
    printf("\n\n");
    system("pause");
}

// asigna la memoria de la matriz

int * asignar_matriz(int x){
    int i,j;
    int **array;
    array=(int **)calloc(x,sizeof(int *)); // se reserva memoria  para la matriz de x filas que contiene direcciones de memoria a las segundas dimensiones.
    for (i=0;i<x;i++){
        array[i]=(int *)calloc(x,sizeof(int *)); // se reserva memoria para las segundas dimensiones , x columnas
    }
    // en memoria ya tenemos reservado espacio para una matriz de x por x --> array[x][x]
    return &*array; // retorno de un puntero doble
}

// rellena de 1s la diagonal y de 0 lo demas

void diagonal_matriz(int **array,int x){
    int i,j;
    for (i=0;i<x;i++){
        for (j=0;j<x;j++){
            if (i==j){
                array[i][j]=1;
            }
            else{
                array[i][j]=0; // esto no lo tenía el código original.
            }
        }
    }
}

// imprime la matriz

void imprimir_matriz(int **array,int x){
    int i,j;
    printf("\nIMPRIMIENDO MATRIZ\n");
    printf("\n==================\n");
    // manejo del puntero doble recibido como si fuese una matriz
    for (i=0;i<x;i++){
        printf("\n");
        for (j=0;j<x;j++){
            printf("%d ",array[i][j]);
        }
    }
}
    
answered by 28.09.2018 в 00:38