08 de maio de 2010

De modo geral (mas com várias contradições), uma string em C é basicamente um array de chars, ou especificamente um char *. Por essa razão é possível operar em strings apenas utilizando ponteiros. Um exemplo bem legal é a função strlen da biblioteca padrão. O código comenta tudo sobre o assunto, então vamos direto ao ponto.

int strlen(char *s)
{
    char *p = s;

    //
    // *++p primeiro incrementa, depois retorna valor
    //
    // Ele chega até o NULL, pois:
    //
    // Exemplo:
    // Assumir a string "Hello World", ela tem 11 caracteres + \0
    // +-------+----------+  +-------+----------+
    // | Letra | Endereço |  | Letra | Endereço |
    // +-------+----------+  +-------+----------+
    // |   H   |   28     |  |   W   |   2E     |
    // |   e   |   29     |  |   o   |   2F     |
    // |   l   |   2A     |  |   r   |   30     |
    // |   l   |   2B     |  |   l   |   31     |
    // |   o   |   2C     |  |   d   |   32     |
    // |       |   2D     |  |  \0   |   33     |
    // +-------+----------+  +-------+----------+
    //
    // Ao chegar em \0, o loop termina. Mas, p estará apontando
    // para o endereço 33, ou seja, \0.
    // No final, a diferença p-s fará 33 - 28 (início da string, para onde s aponta)
    // totalizando 11.
    //
    // Para verificar isso, como exemplo, usar 28+12 = 40.
    // Mas, entre de 28 até 40 são 13 números que existem, mesmo caso acima e por
    // isso que NULL não é contado, mesmo que p fique apontando para \0 no final.
    //
    while(*++p);

    return (int)(p-s);
}

Observação: Talvez nunca nem eu nem você tenhamos que nos preocupar com operações do gênero, de tão baixo nível, ainda mais que como eu mesmo disse, isso é uma função da biblioteca padrão (ou como no caso de C++ que abole as strings de C com a classe string). Mas, estudar nunca é demais, isso ajuda a clarear ainda mais sobre ponteiros.


One Comment

Deixe uma resposta

Nome Obrigatório:

Email Obrigatório:

Website

Comentário Obrigatório:

RSS
Livros de Ruby e Rails no Submarino Livros de Ruby e Rails na Amazon