Tipo de Dados

    C tem um sistema de tipos semelhante ao de alguns descendentes da linguagem ALGOL. Possui tipos para números inteiros de vários tamanhos com e sem sinal, números de ponto flutuante, caracteres e estruturas (structs). C usa extensivamente ponteiros, um tipo muito simples de referência que guarda o endereço de memória da variável. Ele pode ser desreferenciado, ou seja, pára de apontar para a memória. 
    Os ponteiros em C possuem um valor reservado especial, "NULL", que indica que não estão a apontando para uma morada (da memória). O uso desse valor como morada é muito útil na construção de várias estruturas de dados, mas causa comportamento não-definido (possivelmente uma falha de sistema) ao ser desreferenciado. Um ponteiro que possui o valor NULL é chamado ponteiro nulo. Os ponteiros são declarados (e desreferenciados) com um * (asterisco), portanto o tipo int* denota um ponteiro para número(s) inteiro(s). A linguagem C também fornece um tipo especial de ponteiros, o void*, que se traduz num ponteiro que aponta para um objecto de tipo desconhecido.
    A linguagem C também tem apoio a nível de linguagem para vetores estáticas (de dimensão fixa) de tipos. As disposições de tipos podem parecer ter mais que uma dimensão apesar de serem tecnicamente disposições de disposições de tipos. Em memória, tais estruturas são posicionadas com as linhas uma depois da outra (a alternativa seria armazenar os dados em colunas, usado em outras linguagens). O acesso a disposições de tipos é feito através de ponteiros e aritmética de ponteiros; o nome da disposição é tratado como se fosse um ponteiro que aponta para o início da disposição. Em certas aplicações não é razoável usarem-se disposições de tipos de dimensão fixa e por isso a alocação dinâmica de memória pode ser usada para criar disposições de tipos de dimensão variável.
    Como a linguagem C é regularmente usada em programação de baixo-nível de sistemas, há casos em que é necessário tratar um número inteiro como sendo um ponteiro, um número de ponto flutuante como sendo um número inteiro ou um tipo de ponteiro como sendo outro. Para estes casos, a linguagem C fornece a capacidade de "moldagem" (também denominado "conversão de tipo" ou casting), uma operação que, caso seja possível, força a conversão de um objecto de um tipo para outro. Apesar de ser por vezes necessário, o uso de conversões de tipo sacrifica alguma segurança oferecida pelo sistema de tipos.

                Os Tipos Primitivos do C

    A linguagem C tem 5 tipos básicos: 

  • char: Caracter: O valor armazenado é um caractere. Caracateres geralmente são armazenados em códigos (usualmente o código ASCII);
  • int: Número inteiro: é o tipo padrão e o tamanho do conjunto que pode ser representado, normalmente depende da máquina em que o programa está rodando.
  • float: Número em ponto flutuante de precisão simples. São conhecidos normalmente como números reais.
  • double: double é o ponto flutuante duplo e pode ser visto como um ponto flutuante com muito mais precisão.
  • void: void é o tipo vazio, ou um "tipo sem tipo". Este tipo serve para indicar que um resultado não tem um tipo definido. Uma das aplicações deste tipo em C é criar um tipo vazio que pode posteriormente ser modificado para um dos tipos anteriores.

    Para cada um dos tipos de variáveis existem os modificadores de tipo. Os modificadores de tipo do C são quatro: signedunsignedlong e short. Ao float não se pode aplicar nenhum e ao double pode-se aplicar apenas o long. Os quatro modificadores podem ser aplicados a inteiros. A intenção é que short e long devam prover tamanhos diferentes de inteiros onde isto for prático. Inteiros menores (short) ou maiores (long). int normalmente terá o tamanho natural para uma determinada máquina. Assim, numa máquina de 16 bits, int provavelmente terá 16 bits. Numa máquina de 32, int deverá ter 32 bits. Na verdade, cada compilador é livre para escolher tamanhos adequados para o seu próprio hardware, com a única restrição de que shorts ints e ints devem ocupar pelo menos 16 bits, longs ints pelo menos 32 bits, e short int não pode ser maior que int, que não pode ser maior que long int. O modificador unsigned serve para especificar variáveis sem sinal. Um unsigned int será um inteiro que assumirá apenas valores positivos. A seguir estão listados os tipos de dados permitidos e seu valores máximos e mínimos em um compilador típico para um hardware de 16 bits. Também nesta tabela está especificado o formato que deve ser utilizado para ler os tipos de dados com a função scanf(): 

 
 

    O tipo long double é o tipo de ponto flutuante com maior precisão. É importante observar que os intervalos de ponto flutuante, na tabela acima, estão indicados em faixa de expoente, mas os números podem assumir valores tanto positivos quanto negativos.

 

            Os Tipos Compostos do C    

  •     Arrays: É um conjunto de elementos (ou variáveis) do mesmo tipo numa zona contígua de memória. Exemplo (declaração dum array de inteiros):                 

int  x[3] = {5,4,7};

  •     Apontadores: No caso particular duma variável apontadora, o valor (inteiro) que ela contém é um endereço de memória. Uma das principais aplicações de apontadores é na manipulação de arrays e strings. Exemplo:

  •     Strings: É um tipo de dados composto definido através dum array de caracteres. Exemplo:

char  s[ ] = “Alberto”;

  •     Structs: É uma coleção ou conjunto de elementos (ou variáveis) numa zona contígua de memória. Ao contrário dos arrays, os elementos não são necessariamente do mesmo tipo.

  •     FILE: É um tipo de dados composto ou estruturado de informação. Mais concretamente, FILE é uma estrutura (struct). As variáveis do tipo FILE diferem de todas as outras pelo facto de estarem associadas a ficheiros em disco:

 

 

Fontes:

www.ead.cpdee.ufmg.br/cursos/C/aulas/c320.html

pt.wikipedia.org/wiki/C_(linguagem_de_programa%C3%A7%C3%A3o)#Tipos_de_dados

 www.di.ubi.pt/~programacao/capitulo6.pdf 

www.di.ubi.pt/~programacao/capitulo7.pdf

www.di.ubi.pt/~programacao/capitulo8.pdf

www.di.ubi.pt/~programacao/capitulo10.pdf

www.di.ubi.pt/~programacao/capitulo11.pdf