Programar em C/Ponteiros: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Wbrito (discussão | contribs)
Edudobay (discussão | contribs)
Linha 185:
Quando uma função recebe como parâmetros os endereços e não os valores das variáveis, dizemos que estamos a fazer uma '''chamada por referência'''; é o caso desse último exemplo. Quando passamos diretamente os valores das variáveis para uma função, dizemos que é uma '''chamada por valor'''; foi o caso do segundo exemplo.
 
== AritméticaPonteiros dee ponteirosvetores ==
 
Em C, os elementos de um vetor são sempre guardados seqüencialmente, a uma distância fixa um do outro. Com isso, é possível facilmente passar de um elemento a outro, percorrendo sempre uma mesma distância para frente ou para trás na memória. Dessa maneira, podemos usar ponteiros e a aritmética de ponteiros para percorrer vetores. Na verdade, vetores ''são'' ponteiros ― um uso particular dos ponteiros. Acompanhe o exemplo a seguir.
Podemos usar as operações aritméticas para lidar com os endereços guardados nos ponteiros, afinal de contas os endereços não passam de valores binários ou se quisermos numéricos.
 
#include <iostreamstdio.h>
using namespace std;
const int MAX = 3;
int main ()
{
int testScore[MAX] = {4, 7, 1}i;
int *iPtrvetorTeste[3] = testScore{4, 7, 1};
cout <<int testScore*ptr <<= endlvetorTeste;
cout << iPtr << endl;
printf("%p\n", vetorTeste);
cout << &iPtr << endl;
printf("%p\n", ptr);
for (int i = 0; i < MAX; i++)
printf("%p\n", &ptr);
{
cout << "The address of index " << i << " of the array is "<< & iPtr[i] << endl;
for (int i = 0; i < MAX3; i++)
cout << "The value at index " << i << " of the array is "<< iPtr[i] << endl;
} {
printf("O endereço do índice %d do vetor é %p\n", i, &ptr[i]);
system ("pause");
printf("O valor do índice %d do vetor é %d\n", i, ptr[i]);
return 0;
{ }
return 0;
}
Reparem que eu não coloco o operador address em testScore porque ele já é um address
int* iPtr = testScore;
 
A partir do momento que coloco o ponteiro para o endereço do array, eu posso utilizar iPtr[i] é como que pudesse saltar de variável em variável.
Mas isto na verdade é uma operação, uma operação de adição escondida.
ter iPtr[i] é igual a ter iPtr=iPtr +1
 
Mas neste caso estamos a incrementar o valor de uma variável que guarda um endereço logo ao adicionarmos uma unidade estamos a fazer com que ele agora aponte para a variável seguinte.
Mas aqui há um pormenor é que a variável seguinte será sempre da mesma tipologia da anterior.
ie, se o ponteiro estiver a apontar para um int passa a apontar para o int seguinte, se for float passa para o float seguinte.
 
Assim podemos exprimir o valor do segundo elemento de um array das seguintes formas:
tesScore[1];
*(testScore +1);
iPtr[1];
*(iPtr+1)
 
Começamos declarando um vetor com três elementos; depois, criamos um ponteiro para esse vetor. Mas repare que '''não colocamos o operador de endereço''' em vetorTeste; fazemos isso porque um vetor já representa um endereço, como você pode verificar pelo resultado da primeira chamada a printf().
 
Como você já viu anteriormente neste capítulo, podemos usar a sintaxe <code>*(ptr + 1)</code> para acessar o inteiro seguinte ao apontado pelo ponteiro ''ptr''. Mas, se o ponteiro aponta para o vetor, o próximo inteiro na memória será o próximo elemento do vetor! De fato, em C as duas formas <code>*(ptr + ''n'')</code> e <code>ptr[''n'']</code> são equivalentes.
 
Não é necessário criar um ponteiro para usar essa sintaxe; como já vimos, o vetor em si já é um ponteiro, de modo que qualquer operação com ''ptr'' será feita igualmente com ''vetorTeste''. Todas as formas abaixo de acessar o segundo elemento do vetor são equivalentes:
 
vetorTeste[1];
*(testScorevetorTeste + 1);
iPtrptr[1];
*(iPtrptr + 1)
 
Repara ainda na seguinte possibilidade: atribuir o valor de um ponteiro a outro (depois de declarados, e iniciado)
Linha 251 ⟶ 244:
* *(p+5)
conteúdo do ponteiro 5 posições adiante (curto e grosso :)
 
 
== Comparando endereços ==