Pointer to Structure in C Tutorial

  • Post author:
  • Post category:C

In this section, we will learn the use of pointers on structures in C.

Note: we’re assuming you already familiar with the structures in C Programming.

C Pointers to Struct

Just like the way we use pointers to basic-data types, we can use pointers to structure-types as well.

But the way we use pointers to access the fields of a structure is different from the usual way of using dot `.` operator.

In short, we use `->` operator (dash followed by the greater-than sign) in order to access the fields of a structure-variable.

Example: pointers to structs in C

#include <stdio.h>
struct address{
    char * city;
    char * street;
    int zip;
};
struct employee {

    char *name ;
    char *lastName ;
    int id;
    struct address homeAddress;
};
int main() {


    struct employee ellen = {.name="Ellen",
            .lastName = "Cordon",
            .id= 21,
            .homeAddress= { .city = "xyz", .street = "fff", .zip = 321333}
    };

    struct employee * pEllen = &ellen;
    pEllen->id = 25;
    printf("%s %s %d %s %s %d \n",pEllen->name, pEllen->lastName,pEllen->id, pEllen->homeAddress.city, pEllen->homeAddress.street, pEllen->homeAddress.zip );
    return 0;
}

Output:

Ellen Cordon 25 xyz fff 321333

In this example, we assigned the address of the `ellen` variable to the `pEllen` which is a pointer of type `employee`.

Then via `->` operator we used the `pEllen` pointer to change the value assigned to the `id` field.

Also, in the call to the `printf()` function we used `pEllen` pointer and `->` operator to access the value of each field of `ellen` variable and sent them to the output stream.

Passing structure-variables to functions by address:

With the help of pointers, we can pass a structure-variable to a function as its argument by address. In such a case, the target function is capable of changing the content of the structure-variable and this change is visible to both the pointer and the structure-variable itself.

Note: if you want to know more about pointers, you can check the pointers section.

Example: passing structures to functions by address

#include <stdio.h>
struct address{
    char * city;
    char * street;
    int zip;
};
struct employee {

    char *name ;
    char *lastName ;
    int id;
    struct address homeAddress;
};
void changeContent (struct employee *);
int main() {


    struct employee ellen = {.name="Ellen",
            .lastName = "Cordon",
            .id= 21,
            .homeAddress= { .city = "xyz", .street = "fff", .zip = 321333}
    };

    changeContent(&ellen);
    printf("The employee's id is: %d \n",ellen.id );
    return 0;
}
void changeContent(struct employee * emp){

    emp->id = 50;
}

Output:

The employee's id is: 50

Here in this example, the `changeContent()` function accepts one argument and that is a pointer to any variable of type `employee-structure`.

So we can pass the address of the `ellen` variable because this variable is of type `employee`.

Also inside the body of the `changeContent()` function, we changed the value of the `id` field and so this change is also visible when we called the `id` field via the `ellen` variable in the `printf()` function.

C Struct: Dynamic Memory Allocation

As mentioned in `malloc()` and `calloc()` sections, we can dynamically allocate memory to basic-type variables. The same is also possible for structure-type variables as well.

Example: dynamically allocate memory for structures in C

#include <stdio.h>
#include <stdlib.h>
struct address{
    char * city;
    char * street;
    int zip;
};
struct employee {

    char *name ;
    char *lastName ;
    int id;
    struct address homeAddress;
};
int main() {

    struct employee * pEmp = (struct employee *) malloc(sizeof(struct employee));
    pEmp->id = 10;
    pEmp->lastName = "Kimber";
    pEmp->name = "Bauer";
    pEmp->homeAddress.zip = 111111;
    pEmp->homeAddress.street= "sssss";
    pEmp->homeAddress.city = "CCC";

    printf("id: %d name: %s last name: %s\n", pEmp->id , pEmp->name, pEmp->lastName);
    return 0;
}

Output:

id: 10 name: Bauer last name: Kimber

The important part of this example is the call to the sizeof operator as ` sizeof(struct employee)`. The return value of calling to the `sizeof()` operator here in this example is the sum of bytes that each field of the `employee` structure takes.

After the call to the `malloc()` function, the returned pointer is casted to the `struct employee *` and the `pEmp` variable took the address of this allocated memory space.

The rest of codes are exactly the same as if we assigned the address of a `structure-variable` to a pointer.

Leave a Reply