Ponteiros 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.
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
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.
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.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Incrível!
Completion taxa melhorada para 4.35
Ponteiros 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.
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
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.
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.
Obrigado pelo seu feedback!