C é uma linguagem simplificada. Dá a você o metal puro. Nem inclui funções para ler em um teclado ou escrever em uma tela. Se você quer isso, você tem que construí-lo.

Tudo além do básico absoluto está em bibliotecas.

Você conhece a biblioteca stdio. Ele lida com entrada e saída padrão. Existem outros para matemática. Manipulação de strings. Manipulação do tempo. Eles existem para que você não precise reinventar a roda toda vez que iniciar um novo projeto.

Mas por que parar no que a norma fornece?

Colocar código em bibliotecas torna-o reutilizável. Ele permite dividir programas enormes em módulos gerenciáveis. Mais fácil de testar. Mais fácil de depurar. Você pode extrair código de seus projetos antigos e colocá-lo em novos sem copiar e colar blocos de lógica.

Vejamos como fazer isso.

Extraindo lógica em funções

Pegue um programa C padrão que preencha um array com números aleatórios e os classifique. Aqui está o código bruto:

Este código faz três coisas. Ele preenche um array com números aleatórios. Ele os classifica usando uma classificação por bolha. Ele imprime o resultado.

Para fazer uma biblioteca reutilizável, precisamos isolar a lógica de classificação.

Etapa um: generalizar a classificação

Extraia o código de classificação de bolha. Transforme-o em uma função.

Como o array a e a constante MAX são globais, a função inicialmente não precisa de parâmetros. Também não precisa retornar um valor. Basta usar variáveis ​​locais para x, y e t.

Agora atualize main para chamar esta função em vez de executar o loop embutido.

Funciona. Mas ainda está vinculado a uma matriz global.

Etapa dois: passar o array

Podemos tornar a função de classificação verdadeiramente genérica. Passe o próprio array como parâmetro.

A assinatura muda para:

Isso diz ao compilador para aceitar um array inteiro de qualquer tamanho. O corpo da função permanece exatamente o mesmo. Você acabou de atualizar a chamada em main :

Notou algo estranho? Passamos a, não &a.

Mesmo que a função sort modifique o array, não precisamos do operador address-of aqui. Parece contra-intuitivo se você está acostumado com linguagens de passagem por valor. Você pode estar se perguntando por que isso funciona sem ponteiros explicitamente na chamada.

Isso ocorre porque em C, os arrays decaem em ponteiros quando passados ​​​​para funções. A função recebe uma referência ao início do array na memória. É por isso que pode modificar os dados originais.

Compreender essa distinção é a porta de entrada para dominar os ponteiros. Sem ele, as bibliotecas C são apenas blocos estáticos de código. Com ele, você constrói sistemas modulares e portáteis.