Ir para conteúdo
Fórum Script Brasil
  • 0

Alterando endereços armazenados nos ponteiros em funções C


Mortanius

Pergunta

Tive a ideia de alterar os endereços de dois ponteiros (um pelo outro) invés de trocar os valores armazenados por eles.

A intenção seria fazer isso com vetores (arrays), já que seria mais viável, aí veio o problema:

Funcionou com ponteiros mas não funcionou com os vetores.

Podem me ajudar a entender por quê?

Os códigos:

Ponteiros:

#include<stdio.h>
#include<stdlib.h>
void invert_ad (int** a, int** b)
{
    int* temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
main()
{
    int a = 10;
    int* pointer_a = &a;
    int** ppointer_a = &pointer_a;
    int b = 20;
    int* pointer_b = &b;
    int** ppointer_b = &pointer_b;
    printf("pointer_a Adress: %p\n", pointer_a);
    printf("pointer_b adress: %p\n", pointer_b);
    invert_ad (ppointer_a, ppointer_b);
    printf("pointer_a adress: %p\n", pointer_a);
    printf("pointer_b adress: %p\n", pointer_b);
}

Arrays:

#include<stdio.h>
#include<stdlib.h>
void invert_ad (int** a, int** b)
{
    int* temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
main()
{
    int array_a[5] = {0, 1, 2, 3, 4};
    int array_b[5] = {5, 6, 7, 8, 9};
    int** parray_a = &array_a;
    int** parray_b = &array_b;
    printf("array_a adress %p\n", array_a);
    printf("array_b adress %p\n", array_b);
    invert_ad (parray_a, parray_b);
    printf("array_a adress %p\n", array_a);
    printf("array_b adress %p\n", array_b);
}

 

Editado por Mortanius
Atualização da dúvida
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

 

  Em 11/07/2016 em 01:23, Mortanius disse:

Funcionou com ponteiros mas não funcionou com os vetores.

Expand  

  Fácil... arrays são um tipo de ponteiros constantes, na realidade não são nem considerados ponteiros, não foram pensados para ser 'trocados'.

você pode ler esse tópico(em inglês)  para obter uma serie de idéias de como solucionar o problema: http://stackoverflow.com/questions/3393518/swap-arrays-by-using-pointers-in-c

Sorte.

Link para o comentário
Compartilhar em outros sites

  • 0
  Em 11/07/2016 em 07:46, vangodp disse:

 

  Fácil... arrays são um tipo de ponteiros constantes, na realidade não são nem considerados ponteiros, não foram pensados para ser 'trocados'.

você pode ler esse tópico(em inglês)  para obter uma serie de idéias de como solucionar o problema: http://stackoverflow.com/questions/3393518/swap-arrays-by-using-pointers-in-c

Sorte.

Expand  

Valeu por responder, vangodp. Tinha tirado essa dúvida ainda essa madrugada noutro fórum e, de fato: estava confundindo arranjos com vetores, achando que se comportavam da mesma forma, mas o arranjo tem tamanho fixo, e o mesmo vale pro endereço, nem como ponteiro pude usar. Valeu.

Link para o comentário
Compartilhar em outros sites

  • 0
  Em 11/07/2016 em 14:08, Mortanius disse:

Valeu por responder, vangodp. Tinha tirado essa dúvida ainda essa madrugada noutro fórum e, de fato: estava confundindo arranjos com vetores, achando que se comportavam da mesma forma, mas o arranjo tem tamanho fixo, e o mesmo vale pro endereço, nem como ponteiro pude usar. Valeu.

Expand  

Com memória dinâmica sim você pode faze-lo, todo o problema está a causa da pilha, o ultimo prato a ser inserido será o primeiro em ser retirado, então realmente não podemos manipular essas direções, porem se usar malloc para reserva de memória sim você será possível fazer o que quer.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.

×
×
  • Criar Novo...