Ir ao conteúdo
  • Cadastre-se

C Aritmética de ponteiros em matrizes


jajao

Posts recomendados

Olá,

estou com uma dúvida em um exercicio sobre matrizes e aritmetica de ponteiros. A questãoo pede para trocar as notações X[ i ][ j ] , por exemplo , para utilizar a notação   --------   >>>      *(X + i * ncolunas + j) (não entendi essa notação e procurando na internet nao encontrei nada a respeito). Comecei a programar esse ano e ainda não entendi muito bem o assunto ponteiros , principalmente como representá-los utilizando vetores e matrizes. A questao e uma simples multiplicação de matrizes utilizando uma função, que eu já fiz. Aqui está o código.

#include <stdio.h>

void LerMatriz(float *x,int n, int m){
    int i,j;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++){
            printf("Elemento [%d][%d] = ",i,j);
            scanf("%f", (x+(i*m)+j));
            
        }
}

void EscreverMatriz(float *x,int n, int m){
    int i,j;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++){
            printf("%6.2f",*(x+(i*m)+j));
            printf("\n");        
        }
}

void MultiplicarMatriz(float *x, float *y, float *z, int n, int m, int l){
    int i,j,k;
    for(i=0;i<n;i++)
        for(j=0;j<l;j++){
            *(x+(i*l)+j) = 0;
            for(k=0;k<m;k++)
                *(x+(i*m)+j) = *(x+(i*m)+k) * *(x+(k*m)+j);
            }
}

int main(){
    float *a,*b,*c;
    int m,n,l;
    puts("de 3 valores inteiros n,m e l:\n");
    scanf("%d %d %d",&n,&m,&l);
    puts("Digite a primeira matriz:");
    LerMatriz(a,n,m);
    puts("Digite a segunda matriz:");
    LerMatriz(*b,m,l);
    EscreverMatriz(*a,n,m);
    EscreverMatriz(*b,m,l);
    MultiplicarMatriz(*a,*b,*c,n,m,l);
    puts("Matriz produto\n");
    EscreverMatriz(*c,n,l);
    return 0;
}

Parece algo simples, mas n sei se quando utilizo os ponteiros ainda preciso declarar os vetores ou não.

Alguém poderia dar uma ajuda??

 

Link para o comentário
Compartilhar em outros sites

13 horas atrás, jajao disse:

Parece algo simples, mas n sei se quando utilizo os ponteiros ainda preciso declarar os vetores ou não.

Alguém poderia dar uma ajuda??

Depende do que você esta fazendo, para maior performance use a pilha do sistema (memória dedicada no arranque do programa pelo sistema operacional), porque ponteiros são tipos de variáveis que armazenam um só coisa: O endereço de memória. 

 

Cada tipo de ponteiros tem sua implementação interna (implícita) de acordo com a largura (em bytes) de sua variável. A implementação do programador (explicita) usa apontadores para avançar: ir enfrente e ou para traz na memória em saltos de byte em bytes.

 

A variável de um ponteiro é o tipo determinado de dados que a representa, isso vem na declaração do ponteiro no instante de seu instanciamento. Por exemplo, um ponteiro para tipo int (sistema 32 bits) salta 4 bytes a cada incremento para mais ou para menos nos endereços de memória.

 

A memória é linearmente organizada que vai do 0 até o limite do que tem instalado. Ainda sim os primeiros bytes dessa memória não podem ser modificados por ninguém porque estão reservados para as referências (endereços de memória) que são os índices dela também. Imagine que a memória de um computador moderno foi organizada tal qual uma vetor que vai de x até o limite dela, uma pequena parte da própria memória e utilizada para armazenar os índices (x até o limite) e a maior parde dela passa para sistema operacional. As referência são criadas após o boot atestar sua integridade e depois entregues ao sistemas operacional que fará o gerenciamento final.

Leitura recomendada: https://pt.wikipedia.org/wiki/Ponteiro

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Ponteiros guardam apenas endereços de memória, logo seu programa não está alocando memória para guardar os dados propriamente ditos das matrizes, então você precisa alocar memória, seja criando um vetor normal (float vetor[n*m]), ou uma matriz (float matriz[n][m]), ou usando funções de alocação dinâmica de memória (malloc/calloc).

 

Então poderá usar ponteiros para 'apontar' para estes locais da memória onde os dados são guardados, permitindo então ler ou alterar estes dados que são apontados pelo ponteiro.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!