Trying to understand c/c++ pointers

Asked

Viewed 105 times

2

Hi guys I’m new to the stack and it’s like this: I’m studying pointers and I made the following code:

typedef struct {
    char nom[256];
    int size;
    float value;
}tdados; // criando o tipo tdados com base na struct

// função que inicializa

tdados inicializa(tdados *dados) { // iremos apontar para uma variabvel
(*dados).size = -1;
}

tdados e_inicializa(tdados dados) { // por não apontar para o endereço dá erro
    dados.size = 2;
    // o erro é que em vez de ir por endereço fdaz um fetch da variavel que causa problemas
    // o programa nã realiza o fetch
}
int main(int argc, char const *argv[])
{
    tdados dados;
    tdados edados;
    inicializa(&dados);
    e_inicializa(edados);


    fprintf(stdout,"Inicialização correta\nTamanho:\t%i\n",dados.size);
    fprintf(stdout,"Inicialização errada\nTamanho:\t%i\n",edados.size);
    return 0;
}

I know that in the case of the function initializes it works because I use the pointer of the variable given to be able to work with this and at the time of the call step the absolute value (&) contained in the address, in the second case (function e_initializes) just step the variable in a "simple" way. I know I’m using pointer but I’d like the justification of why one case works and another doesn’t.

2 answers

2


Because when you does not pass by a pointer or reference, passes as a copy.

That is, changes a new object created in a new address.

With this example, it is easier to illustrate:

#include <stdio.h>

typedef struct
{
    char nom[256];
    int size;
    float value;
} tdados; // criando o tipo tdados com base na struct

// função que inicializa

tdados inicializa(tdados *dados)
{ // iremos apontar para uma variabvel
    (*dados).size = -1;
    printf("Inicializa objeto em: %p\n", dados);
}

tdados e_inicializa(tdados dados)
{ // por não apontar para o endereço dá erro
    dados.size = 2;
    printf("E_Inicializa objeto em: %p\n", &dados);
    // o erro é que em vez de ir por endereço fdaz um fetch da variavel que causa problemas
    // o programa nã realiza o fetch
}

int main(int argc, char const *argv[])
{
    tdados dados;
    tdados edados;
    printf("Objeto dados em: %p\n", &dados);
    printf("Objeto edados em: %p\n", &edados);

    inicializa(&dados);
    e_inicializa(edados);

    fprintf(stdout, "Inicialização correta\nTamanho:\t%i\n", dados.size);
    fprintf(stdout, "Inicialização errada\nTamanho:\t%i\n", edados.size);
    return 0;
}

Exit:

Objeto dados em: 0x7ffee5d479b0
Objeto edados em: 0x7ffee5d478a8
Inicializa objeto em: 0x7ffee5d479b0
E_Inicializa objeto em: 0x7ffee5d47560
Inicialização correta
Tamanho:        -1
Inicialização errada
Tamanho:        0

Note how the address in "Initialize object" is the same as "Object given", i.e., you are dealing with the object at that memory address.

-1

You are going to edados in the function, but since it is not by pointer the value does not remain. The right one would return in the function.

edados = e_inicializa(edados);

and put a Re-turn inside e_inicializa:

tdados e_inicializa(tdados dados) {
    dados.size = 2;
    return dados;
}

In addition you declared the functions as tdados and they return nothing.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.