Olá, seja bem-vindo de volta. Agora que entendemos os ponteiros um pouco
mais detalhadamente, quero falar sobre os ponteiros de caracteres,
principalmente como você pode usar ponteiros de caracteres para representar strings.
Strings são matrizes de caracteres, vários caracteres, palavras.
Portanto, agora sabemos como os arrays se relacionam com os ponteiros no conceito de aritmética de ponteiros.
Conceito muito, muito útil.
Esses conceitos podem ser muito úteis quando aplicados a
strings de matrizes de caracteres porque agora podemos percorrer facilmente uma string caractere por caractere.
Uma das aplicações mais comuns de usar um ponteiro para uma matriz é como
um ponteiro para uma sequência de caracteres.
As razões são de conveniência e eficiência notacionais.
Portanto, usar uma variável do tipo ponteiro para char para fazer
referência a uma string oferece bastante flexibilidade.
Portanto, você tentará usar ponteiros
de caracteres o máximo que puder sobre
matrizes de caracteres, especificamente usando ponteiros de caracteres para passar dados para uma função.
Todos os tipos de coisas legais assim.
Então, vamos ver um exemplo que usa um array para copiar uma string.
Neste exemplo, nosso parâmetro de array será um array de caracteres.
Você verá isso na declaração da função.
Quero comparar isso a uma função que usa um ponteiro de
caractere e mostrar como a função de ponteiro de caractere é muito mais eficiente.
Portanto, neste exemplo, temos duas funções, uma
que pega um array e outra
que pega ponteiros.
Na primeira string de cópia de
função, podemos percorrer todo o array usando um loop for I igual a zero de
sub I e percorrer todo o caminho até ver a string de caractere nulo
e então incrementar nossa variável de controle de loop.
E então tudo que você precisa fazer é dizer que 2 sub I é igual a sub I. Estamos fazendo uma atribuição
direta lá.
E então, bem no final, depois de percorrermos todo o caminho até vermos
o caractere nulo, adicionamos um caractere nulo ao final de
nosso array to, bastante básico. Agora vamos ver como fazemos isso quando usamos ponteiros.
Primeiro, declaramos os ponteiros como a declaração de função na string
de cópia dizendo apenas char star para char começar.
Em nosso loop for, não precisamos realmente declarar nenhuma
variável porque temos ponteiros e queremos apenas
iterar até que o from atinja o terminador nulo.
E então podemos incrementar os ponteiros de e para.
Porque aqui estamos fazendo aritmética de pontos.
Estamos apenas adicionando um ao ponteiro que está aumentando seu endereço em um, que está
obtendo o próximo caractere.
E a próxima linha do loop for nós apenas
desreferenciamos de e para porque queremos atribuir o
valor real para o qual o ponteiro está apontando, o
caractere real para o ponteiro to.
E então, no final, adicionamos o caractere
nulo para onde quer que o ponteiro para esteja
apontando, que estaria no final do último endereço da string de, mas agora
apontando para o endereço para.
Não parece tão ruim. Quer dizer, você tem um loop for.
Você basicamente tem a mesma quantidade de linhas de código.
Mas você vê a diferença na sintaxe.
Você não usa subscritos e usa ponteiros, use o asterisco.
Novamente, realmente uma questão de conveniência de notação.
Você não vê uma grande vantagem aqui.
Mas você pode realmente otimizar isso mais para
chegar a menos código ao usar os ponteiros.
Portanto, se você tiver um array de
char como um ponteiro, se você tiver um array de caracteres chamado texto, você pode definir
de forma semelhante um ponteiro para ele e usar os elementos no texto.
Então aqui poderíamos dizer ponteiro de texto
estrela char, é assim que você define um ponteiro de caractere.
Se o ponteiro de texto estiver definido apontando para o início do
array de caracteres chamado texto, você
pode apenas incrementá-lo em um usando esses operadores de pré e pós-implementação e decrementação.
Assim, acima, este ponteiro de mais mais texto irá definir o ponteiro de texto apontando
para o próximo caractere no texto, que é o sub texto 1.
Portanto, se quisermos olhar no próximo raio como os inteiros, tudo
o que temos a fazer é adicionar 1 2 e podemos obter o próximo caractere.
No entanto, é muito mais útil em
matrizes de caracteres porque você pode manipular facilmente os caracteres um por um.
Se você fizer um ponteiro de menos menos texto, que é o operador de decrementação,
isso definirá o ponteiro para o caractere anterior no texto, presumindo que
o ponteiro do texto não estava apontando para o início do texto.
Porque se fosse, você teria esses erros abaixo dos limites.
Se estivesse fazendo um sinal de mais mais para o final da string, você teria um erro de fora dos limites.
Você sempre tem que ter cuidado, como em uma aritmética de inteiros, para não ultrapassar os limites de um array.
Mas muito simples, ele se relaciona muito de perto com quando você faz
aritmética de ponteiro inteiro.
A aritmética de ponteiro de personagem é a mesma coisa.
É ainda mais útil porque agora você pode realmente olhar para caracteres individuais sem usar um subscrito.
Então, se olharmos para o exemplo
anterior, podemos realmente otimizá-lo um pouco mais usando ponteiros para torná-lo
ainda menos linhas de código.
Portanto, agora em nossa string de cópia, fazemos esta declaração de função é a mesma de
antes, criamos alguns ponteiros usando o asterisco.
Mas não usamos mais um loop for porque era meio inútil
usar um loop for no exemplo
anterior porque não precisávamos realmente inicializar a variável de controle do loop.
Tudo o que precisávamos fazer era sair de um
loop em uma condição e, em seguida, usar os operadores de incremento e
decrementação no loop for, mas nem mesmo precisamos fazer isso.
Na verdade, torna-se ainda mais simples aqui porque se usarmos um loop while, tudo o
que temos a fazer é olhar para o loop while e ele
saltará se estiver apontando para um caractere nulo, porque o caractere nulo é
realmente igual a zero.
E o laço while lembra que os booleanos
em c são representados por inteiros, um é verdadeiro e então zero
é falso ou realmente zero é falso e então qualquer outra coisa é verdadeira.
Neste caso, o caractere nulo 0 que é falso, ele vai pular.
Portanto, tudo o que você precisa fazer para a condição de saída no loop while é colocar um asterisco de.
O que isso está fazendo está desreferenciando para ver qual é o valor desse personagem.
Então, quando chegamos ao final da string que queremos copiar, saltamos.
Caso contrário, simplesmente colocaremos nossa modificação de
nossos ponteiros bem ali, dois mais mais de mais mais.
Agora, este é um operador de pós-incremento.
Portanto, isso significa que o sinal de mais positivo está no lado direito da variável.
E quando você faz isso, significa que você
não adiciona um a ele até que a instrução seja feita.
Então o que isso vai fazer, vai dizer que estrela 2 é igual a partir de.
E então, depois que essa declaração for feita, ela vai somar 2 1 e vai somar a partir de 1.
Se você tivesse o mais mais antes do nome
da variável, seria adicionado àquela variável antes de executar essa instrução e
isso seria um problema porque perderíamos essencialmente o primeiro elemento sendo
copiado na string.
Mas não precisamos de mais linhas de código. Estamos fazendo uma aritmética de ponteiro
de incrementação real e atribuição na mesma instrução, portanto,
reduzimos o código em um.
Novamente, a notação é muito simples.
Estamos fazendo uma atribuição aritmética de inteiros com muita facilidade.
E então, no final, depois que terminarmos de copiar todas
as strings, nós apenas adicionamos ao
final o caractere nulo ao ponteiro que desreferimos porque os dois são realmente o motivo
pelo qual ele passa pelo loop e estará apontando para o último personagem.
Então está um pouco limpo aqui.
Ele mostra o poder dos ponteiros e
como você pode usar ponteiros e aritmética nas mesmas linhas e
com esses operadores de incremento e decrementação, esses mais e menos menos,
torna ainda mais rápido e fácil, portanto, é mais eficiente também.
Se quiséssemos usar essas funções de string de cópia, poderíamos apenas criar duas matrizes de caracteres.
Podemos passar as matrizes de caracteres diretamente para a string de cópia porque as matrizes de
0 caracteres são ponteiros.
Eles são ponteiros, então não precisamos realmente desreferenciá-los ou
adicionar endereços ou qualquer coisa. Poderíamos apenas dizer string2, string1.
E então o que isso vai fazer é copiar
uma string a ser copiada para o array de caracteres
string2 e depois imprimi-la usando printf.
Eu queria mostrar um exemplo de como você pode usar ponteiros de
caracteres em vez de matrizes de caracteres e por que às vezes eles são preferidos.
Mencionamos que às vezes é a preferência do programador, onde
se você programou em linguagens anteriores como Fortran, você
pode estar acostumado a aumentar. Mas se você tiver,
verá os benefícios de usar ponteiros.
Espero que tenha sido útil. Obrigada.