
		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.)