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
Tags:
Alfred Reinold Baudisch em Ruby, Ruby on Rails, Objective C e desenvolvimento de jogos para iPhone.



Parabéns! Esses detalhes minimalistas são tão importantes. Raramente encontro tutoriais com essa profunidade. Em geral só descobrimos essas coisas quando estamos a resolver algum problema…
Obrigado.