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

 

6 horas atrás, Mortanius disse:

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

  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
6 horas atrás, 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.

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
11 minutos atrás, 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.

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.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...