paulo1205
(usa Ubuntu)
Enviado em 27/07/2016 - 15:10h
Um dos motivos de usar ponteiro é para minimizar a quantidade de dados a serem passados de um lado para outro. Não resta dúvidas de que se você tiver uma estrutura cujo tamanho é maior do que o tamanho de um ponteiro, será mais simples copiar apenas o endereço do objeto do que seu conteúdo. Mas nem sempre é o caso. Numa máquina de 64 bits, um dado do tipo
struct in_addr acaba sendo menor do que o ponteiro para essa estrutura.
Mas às vezes a razão não é apenas eficiência. Com frequência você não quer que o usuário tenha acesso aos campos internos de uma estrutura, para não interferir diretamente sobre dados que você quer deixar exclusivamente a cargo da sua biblioteca. O que você pode fazer nesse caso é entregar ao usuário um cabeçalho que contém apenas uma
forward declaration da sua estrutura, possivelmente associada a um nome mais simples por meio de algum
typedef, mas a declaração completa da estrutura nunca aparece por meio do cabeçalho, pois todas as funções que manipulam dados daquele tipo o fazem através de ponteiros.
O próprio compilador não precisa da declaração completa para tratar ponteiros daquele tipo: todos os ponteiros têm o mesmo tamanho, então ele sabe quantos bytes alocar para argumentos ponteiros passados à função e quantos bytes receber quando um ponteiro é retornado pela função. Além disso, o nome do tipo, mesmo sendo um tipo que não esteja completamente definido, é suficiente para ele saber distinguir ponteiros para dados daquele tipo de ponteiros para dados de outros tipos, e assim alertar se você tentar atribuir endereços entre ponteiros para dados incompatíveis entre si.
Você certamente já usou muito isso, mesmo antes de observar a SDL. O tipo
FILE de <stdio.h> é um tipo incompleto, de modo que você sempre trabalha com ponteiros para esse tipo, desde o momento da construção do objeto, por meio da função
fopen(), ao longo de sua vida, em que ele pode ser objeto de manipulações por meio de funções de I/O, até o momento em que ele for desconstruído, através de
fclose(). (A título de curiosidade, imagine se cada pessoa que vem a este fórum perguntando sobre como limpar o buffer de entrada tivesse acesso aos campos internos de um objeto do tipo
FILE.)