Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Ponteiros Dentro de Structs | Trabalhando com Ponteiros e Structs
Dominando Structs em C

bookPonteiros Dentro de Structs

Estruturas de dados essenciais, como pilhas, listas encadeadas e árvores, podem conter referências a outros objetos do mesmo tipo para criar conexões ou relacionamentos entre elementos. Estruturas de dados serão abordadas posteriormente neste curso.

Note
Nota

Elementos dessas estruturas de dados geralmente são chamados de nós.

Se você tentar criar uma estrutura contendo um campo do mesmo tipo da própria estrutura, ocorrerá um erro:

struct Node {
    int data;
    struct Node next; // error: `Node` structure contains itself
};

Neste caso, ocorre uma recursão infinita ao determinar o tamanho de tal estrutura.

Essa ideia pode ser implementada utilizando um ponteiro para uma estrutura:

struct Node {
    int data;
    struct Node *next; // pointer to the `Node` structure
};

Este código funciona porque o compilador conhece o tamanho exato de um ponteiro — geralmente 4 ou 8 bytes, dependendo do sistema.
Ele não tenta calcular o tamanho de toda a estrutura aninhada; simplesmente armazena uma referência (address) para ela.

Vamos ver como isso funciona na prática.

main.c

main.c

copy
1234567891011121314151617181920212223242526
#include <stdio.h> struct Node { char name[20]; struct Node* next; }; int main() { struct Node Kate = { "Kate" }; struct Node Tom = { "Tom" }; struct Node Bob = { "Bob" }; Kate.next = &Tom; // Kate --> Tom Tom.next = &Bob; // Tom --> Bob // set a pointer to the first structure in the chain struct Node* pointer = &Kate; while (pointer != NULL) { printf("Address: %p | Name: %s-> | Next address: %p\n", pointer, pointer->name, pointer->next); pointer = pointer->next; // go to the next object } return 0; }

struct Node kate = { "Kate" }; - o campo next não foi inicializado explicitamente no inicializador da struct, então será automaticamente inicializado como um ponteiro nulo (NULL), pois este é o valor padrão para ponteiros quando não apontam para nenhum objeto.

while (pointer != NULL) - o loop será executado até que o ponteiro aponte para o endereço NULL.

Note
Nota

Em linguagens de programação como C e C++, um ponteiro NULL geralmente indica o final de uma lista (ou outra estrutura de dados). Portanto, esse loop será executado até que pointer seja NULL, o que pode ser interpretado como o fim da lista ou estrutura de dados.

question mark

Por que não podemos criar uma estrutura que contenha ela mesma?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 3

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

bookPonteiros Dentro de Structs

Deslize para mostrar o menu

Estruturas de dados essenciais, como pilhas, listas encadeadas e árvores, podem conter referências a outros objetos do mesmo tipo para criar conexões ou relacionamentos entre elementos. Estruturas de dados serão abordadas posteriormente neste curso.

Note
Nota

Elementos dessas estruturas de dados geralmente são chamados de nós.

Se você tentar criar uma estrutura contendo um campo do mesmo tipo da própria estrutura, ocorrerá um erro:

struct Node {
    int data;
    struct Node next; // error: `Node` structure contains itself
};

Neste caso, ocorre uma recursão infinita ao determinar o tamanho de tal estrutura.

Essa ideia pode ser implementada utilizando um ponteiro para uma estrutura:

struct Node {
    int data;
    struct Node *next; // pointer to the `Node` structure
};

Este código funciona porque o compilador conhece o tamanho exato de um ponteiro — geralmente 4 ou 8 bytes, dependendo do sistema.
Ele não tenta calcular o tamanho de toda a estrutura aninhada; simplesmente armazena uma referência (address) para ela.

Vamos ver como isso funciona na prática.

main.c

main.c

copy
1234567891011121314151617181920212223242526
#include <stdio.h> struct Node { char name[20]; struct Node* next; }; int main() { struct Node Kate = { "Kate" }; struct Node Tom = { "Tom" }; struct Node Bob = { "Bob" }; Kate.next = &Tom; // Kate --> Tom Tom.next = &Bob; // Tom --> Bob // set a pointer to the first structure in the chain struct Node* pointer = &Kate; while (pointer != NULL) { printf("Address: %p | Name: %s-> | Next address: %p\n", pointer, pointer->name, pointer->next); pointer = pointer->next; // go to the next object } return 0; }

struct Node kate = { "Kate" }; - o campo next não foi inicializado explicitamente no inicializador da struct, então será automaticamente inicializado como um ponteiro nulo (NULL), pois este é o valor padrão para ponteiros quando não apontam para nenhum objeto.

while (pointer != NULL) - o loop será executado até que o ponteiro aponte para o endereço NULL.

Note
Nota

Em linguagens de programação como C e C++, um ponteiro NULL geralmente indica o final de uma lista (ou outra estrutura de dados). Portanto, esse loop será executado até que pointer seja NULL, o que pode ser interpretado como o fim da lista ou estrutura de dados.

question mark

Por que não podemos criar uma estrutura que contenha ela mesma?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 3
some-alt