Olá, seja bem-vindo de volta.
Nesta palestra, quero falar sobre a relação entre ponteiros e matrizes.
Existe uma relação forte e precisamos entender essa relação antes de podermos realmente
falar sobre aritmética de ponteiros. Então vamos começar.
Uma matriz é uma coleção de objetos do mesmo tipo
aos quais você pode se referir usando um único nome. Sabemos que agora somos muito bons em matrizes.
Estamos usando a matriz de caracteres por algumas seções agora.
É uma matriz que você pode acessar usando um
índice ou subscrito dentro desses colchetes. Nós nos lembramos disso.
Sabemos que os arrays são baseados em zero, eles começam do zero.
Mas, novamente, é apenas uma maneira de manter vários meses com o mesmo nome de variável.
Um ponteiro é uma variável que tem seu valor, um endereço de memória como seu
valor, e pode
fazer referência a outra variável ou constante de um determinado tipo.
Também devemos estar bem claros neste ponto sobre o que é um ponteiro.
Ele apenas contém um endereço de memória.
Você pode usar um ponteiro para manter o endereço de diferentes variáveis em momentos diferentes.
Mas você tem que ter o mesmo tipo. Um ponteiro int deve
apontar para restaurar o endereço de um tipo int.
Matrizes e ponteiros parecem bastante diferentes, mas
estão intimamente relacionados e às vezes podem ser usados de forma intercambiável, especialmente
com a matriz de caracteres.
Na verdade, você pode criar um caractere e lembrar que é
uma string e pode criar um ponteiro de caractere que é essencialmente a mesma coisa.
Existem apenas pequenas diferenças se
você alocar ou não memória e liberá-la com um ponteiro de caractere.
Com um array de caracteres, você não precisa
fazer isso, mas um caractere a também tem tamanho fixo.
Portanto, se você criar uma string de matriz
de caracteres com 20 como tamanho, poderá armazenar apenas 19 caracteres.
Com o ponteiro de caracteres, você pode usar o gerenciamento
de memória dinâmica e pode aumentar ou diminuir o tamanho, pode ser
mais eficiente em relação à memória.
Mas um dos usos mais comuns de ponteiros em c é como ponteiros para matrizes.
É quando você usa
ponteiros com mais frequência, especialmente para personagens.
O ponteiro de caracteres é igual a uma matriz de caracteres.
Os principais motivos para usar ponteiros para
apagar são os de conveniência de notação e de eficiência do programa.
Portanto, você pode usar um array ou um ponteiro em muitos casos, exceto
quando estiver falando sobre gerenciamento de memória dinâmica.
Mas na maioria dos casos você pode. E realmente a única diferença é a
sintaxe, a notação.
É se você usa ou não um subscrito para acessar um elemento
ou se você usa aritmética de
pontos ou não usa o ponteiro de caractere para apontar para o endereço específico desse elemento.
Também é mais eficiente usar ponteiros de caracteres.
Ponteiros para matrizes geralmente resultam em código que usa menos memória e executa mais rápido.
Portanto, você deseja usar um ponteiro para caracteres tanto quanto possível
e um ponteiro para outros tipos de dados também.
Porque é mais rápido e usa menos memória. Ponteiros sobre matrizes em sua maior parte.
Se você tiver uma matriz de 100 inteiros, sabemos
o que isso significa, basta dizer que o valor int é 100. 100 é o tamanho.
Isso significa que você pode armazenar 100 inteiros nessa matriz.
Você também pode definir um ponteiro. Vamos chamá-lo de ponteiro de valores, uma
vez que aponta para o
array de valores e pode ser usado para acessar os inteiros contidos neste array.
Então, nós apenas dizemos o ponteiro dos valores instar. Sabemos como declarar um ponteiro neste ponto.
Ao definir um ponteiro que é usado para apontar os elementos da
matriz, você não designa o ponteiro como um ponteiro de tipo para a matriz.
Até este ponto, tudo o que ouvimos é um ponteiro para o fim e
um ponteiro para o dobro.
Mas quando você está usando matrizes, você não diz matriz pontiaguda.
Esse ponteiro real está apontando para um elemento específico contido na matriz.
Portanto, mantenha isso em mente. Na verdade, não é a matriz inteira
quando você limpa um ponteiro com o endereço dos valores.
Portanto, para definir o ponteiro de valores para apontar para o primeiro elemento da matriz de valores, tudo o que você
precisa fazer é dizer que os valores apontam ou são iguais aos valores.
Você não tem que colocar o endereço lá nem nada. Porque a
matriz de valores é um ponteiro.
Isso é o que você precisa conduzir em sua cabeça, todas
essas matrizes são ponteiros por baixo do capô.
Portanto, se você quiser atribuir o primeiro elemento
de um array a um ponteiro, tudo o que você precisa fazer é especificar o array no
lado direito do operador igual e
no lado esquerdo você tem apenas o ponteiro dos valores.
Isso vai apontar para o primeiro endereço na matriz ou o primeiro elemento.
O operador de endereço não é usado, observe isso.
O compilador c trata a aparência de um nome de array
sem um subscrito como um ponteiro para o array.
Portanto, especificar valores sem um subscrito tem o efeito
de produzir um ponteiro para o primeiro elemento de valores.
E isso significa que agora você pode apontar para valores
subsequentes na matriz apenas incrementando o ponteiro, para ir para o próximo endereço.
E é sobre isso que falaremos nas próximas palestras, quando falarmos sobre aritmética de pontos.
E é realmente apenas uma coisa de notação e também uma coisa de eficiência.
Portanto, uma forma equivalente de produzir um ponteiro para o início dos valores é
também aplicar o endereço do operador ao primeiro elemento da direita.
Portanto, você pode fazer isso de duas maneiras, qualquer uma delas está bem.
Mas você também pode fazer isso. Você poderia dizer o endereço do ponteiro de valores de valor abaixo de zero.
Isso definirá o ponteiro de valores para o primeiro elemento na matriz.
Portanto, você pode usar este ou apenas dizer valores, ponto igual a valor.
Obviamente, sem o e comercial e sem o
subscrito, é um pouco menos código ou mais fácil de escrever.
Isso pode ser um pouco mais claro
porque você não sabe necessariamente que os valores são uma matriz, a menos que observe a declaração.
Mas, novamente, qualquer maneira está bem. O ponteiro de valores é igual aos valores ou
o ponteiro dos valores é igual ao endereço do valor abaixo de zero.
É uma questão de preferência do programador. E, novamente, é uma coisa notacional.
Então, apenas
para reiterar, quando você tem duas expressões
ar sub-i e asterisco ar mais i,
elas têm significado equivalente.
Então, só queremos ter certeza de que você entende isso.
Ambos funcionam se ar for o nome de um array.
Você pode usar o ponteiro e pode retirá-lo de referência.
E ambos funcionam se for uma variável de ponteiro.
Usar uma expressão como ar plus plus só funciona se ar for uma variável de ponteiro.
Portanto, você não pode incrementar um array dizendo
mais mais e esperar que ele vá para o próximo elemento.
Você só pode fazer isso em ponteiros ou ponteiros de array.
Portanto, se temos ar que é um ponteiro apontando para o array e queremos ir
para o próximo elemento, podemos apenas incrementá-lo todas as vezes.
Mas se você disser ar sub-i porque ar sub i é um array
e um array é um ponteiro, você pode desreferenciá-lo dizendo ar que é
ar é um ponteiro
que atribuímos a ar mais i, é a mesma coisa.
Portanto, nas próximas palestras, vamos falar sobre aritmética de
pontos e isso está fortemente relacionado à relação entre matrizes e ponteiros.
Os ponteiros podem ser matrizes. Não é um array de ponteiros, é um elemento.
Portanto, você pode usar o endereço de um ponteiro
para navegar por uma matriz, iterar
por uma matriz. Obrigada.