• Nenhum resultado encontrado

3-Ponteiros-Parte1

N/A
N/A
Protected

Academic year: 2021

Share "3-Ponteiros-Parte1"

Copied!
8
0
0

Texto

(1)

Universidade Federal de Itajubá

Engenharia da Computação

ECO010 - Estruturas de Dados Profa. Claudia A. Izeki

Ponteiros - Parte I

1. Definição, Declaração e Operadores

Um ponteiro é uma variável cujo valor é um endereço de memória. Na Figura 1, xPtr é um ponteiro para um valor do tipo float.

Figura 1. xPtr referencia indiretamente a variável x cujo valor é 10.0

O valor do ponteiro xPtr é o endereço da variável x que, por sua vez, contém o valor 10.0. Assim, o nome de variável x referencia diretamente um valor, sendo que o ponteiro xPtr referencia indiretamente um valor.

No exemplo da Figura 2 é apresentado um programa que declara um ponteiro de nome xPtr e utiliza os seguintes operadores:

& - operador de endereço: obtém o endereço na memória de uma variável;

* - operador de indireção, também chamado de derreferência: obtém o valor da variável apontada.

Na linha 4 é declarada uma variável chamada xPtr como sendo do tipo float *, ou seja, um ponteiro para um valor do tipo float. Lê-se "xPtr é um ponteiro para float" ou "xPtr aponta para uma varíavel do tipo float".

(2)

1 int main() 2 {

3 float x; // x é uma variável do tipo float 4 float *xPtr; // xPtr é um ponteiro para um float 5

6 x = 10.0;

7 xPtr = &x; // xPtr recebe o endereço de x

8

9 cout << "O valor de x é: " << x << endl; 10 cout << "O endereço de x é: " << &x << endl;

11 cout << "O valor de xPtr é: " << xPtr << " que é o mesmo endereço de x" << endl;

12 cout << "O valor de *Ptr é " << *xPtr << " que é o mesmo valor de x" << endl;

13 cout << "O endereço de xPtr é: " << &xPtr;

14 return 0; 15}

Figura 2. Primeiro exemplo com ponteiros e operadores de endereço e de indireção.

Na Figura 3 são apresentadas as impressões na tela do código da Figura 2.

O valor de x é: 10.0

O endereço de x é: 0x22ff0c

O valor de xPtr é: 0x22ff0c que é o mesmo endereço de x O valor de *Ptr é: 10.0 que é o mesmo valor de x

O endereço de xPtr é: 0x22ff08 Figura 3. Saída do programa da Figura 2.

2. Inicialização de variáveis ponteiros Existem 3 formas de inicializar um ponteiro:

Com o valor 0 ou a constante NULL: não aponta para nada. Em C++ é preferível usar a constante 0. Exemplos:

int *x = 0; int *y = NULL;

(3)

Com algum endereço de memória de uma variável já existente. Exemplo: int a = 10;

int *x = &a;

Com a atribuição de um endereço de memória retornado pelo comando new() de alocação dinâmica de memória. Exemplo:

int *y = new int(); // Este comando será explicado posteriormente

3. Argumentos ponteiros na passagem de parâmetro por referência

Ponteiros na chamada por referência podem ser usados para modificar uma ou mais variáveis da função chamadora, ou para evitar sobrecarga através da passagem por valor de dados grandes.

Quando se chama uma função com parâmetros que devem ser modificados, os endereços dos parâmetros devem ser passados. Existem duas formas de passar os endereços dos parâmetros:

empregando-se o operador de endereços & ao nome da variável cujo valor será modificado; ou

escrevendo-se o nome do próprio vetor ou matriz, pois seu nome é sua posição inicial na memória.

Na Figura 4 é apresentada a execução passo a passo de uma chamada à função que troca dois valores utilizando ponteiros.

(4)

Antes da chamada à função troca()...

Função troca() sendo chamada...

Após realizar a troca de valores...

(5)

4. Aritmética de ponteiros

Com a finalidade de apresentar aritmética de ponteiros, é apresentado o exemplo da Figura 6, no qual o ponteiro vPtr aponta para o vetor v (ilustração na Figura 5).

Figura 5. Um vetor v e uma variável ponteiro vPtr apontando para v.

1 int main() 2 {

3 int v[]={10, 20, 30, 40, 50}; // v é um vetor de inteiros 4 int *vPtr; // vPtr é um ponteiro para inteiro

5

6 vPtr = &v[0]; // ou vPtr = v, pois o nome do vetor é o endereço do primeiro elemento

7 cout << "O valor de *vPtr é o mesmo que v[0], que é: " << *vPtr << "\n\n";

8 cout << "Operação vPtr++..." << endl;

9 vPtr++; // incrementa o ponteiro de 1 unidade (tamanho de um inteiro) 10 cout << "O valor de *vPtr é o mesmo que v[1], que é: " << *vPtr << "\n\n";

11 cout << "Operação vPtr = vPtr + 2..." << endl;

12 vPtr = vPtr + 2; // incrementa o ponteiro de 2 unidades (tamanho de 2 inteiros)

13 cout << "O valor de *vPtr é o mesmo que v[3], que é: " << *vPtr << "\n\n";

14 cout << "Operação vPtr--" << endl;

15 vPtr--; // decrementa em uma unidade o valor do ponteiro (tamanho de um inteiro)

16 cout << "O valor de *vPtr é o mesmo que v[2], que é: " << *vPtr << "\n\n";

(6)

18 int *v2Ptr = &v[3];

19 int q;

20 q = v2Ptr - vPtr;

21 cout << "Subtração entre dois ponteiros: v2Ptr - vPtr = " << q; 22 return 0;

23 }

Figura 6. Um programa com várias operações aritméticas de ponteiros.

A saída do programa é apresentada na Figura 7. Inicialmente, vPtr está com o valor 2000 (endereço do primeiro elemento do vetor). Note que a instrução vPtr++ resulta em 2004 e não em 2001, já que somar uma unidade de um ponteiro significa somar uma unidade do tipo ao qual ele aponta (um inteiro, no caso, possui 4 bytes). Sendo o endereço 2004 o do segundo elemento do vetor, então v[1] corresponde ao valor 20. A instrução da linha 20 (subtração entre dois ponteiros) segue o mesmo raciocínio, no qual v2Ptr possui o endereço do quarto elemento, no caso 2012 e vPtr o do terceiro elemento, a subtração v2Ptr-vPtr resulta em 1 e não em 4 (2012-2008).

O valor de *vPtr é o mesmo que v[0], que é: 10

Operação vPtr++...

O valor de *vPtr é o mesmo que v[1], que é: 20

Operação vPtr = vPtr + 2...

O valor de *vPtr é o mesmo que v[3], que é: 40

Operação vPtr--

O valor de *vPtr é o mesmo que v[2], que é: 30

Subtração entre dois ponteiros: v2Ptr - vPtr = 1 Figura 7. Saída do programa da Figura 6.

(7)

5. Relação entre ponteiros e vetores (arrays)

Ponteiros e vetores estão intimamente relacionados: o nome de um vetor é um ponteiro constante1; e os ponteiros podem ser usados para fazer qualquer operação envolvendo

indexação de vetores.

No exemplo da Tabela 1 são apresentados quatro tipos de notação de acesso aos elementos de um vetor:

1.

Uso de subscritos2 com array;

2.

Ponteiro/deslocamento com o nome do array como ponteiro;

3.

Uso de subscritos com ponteiros;

4.

Ponteiro/deslocamento com um ponteiro;

Seja vPtr o mesmo ponteiro dos exemplos das Figuras 5 e 6:

int v[]={10, 20, 30, 40, 50}; int *vPtr = v;

Verifique na Tabela 1 um exemplo de como referenciar o quarto elemento de um array com os 4 tipos de notação descritos acima.

Tabela 1 - Exemplo com os quatro tipos de acesso aos elementos de um vetor. 1 - Uso de subscritos com array v[3]

2 - Ponteiro/deslocamento com o nome do array como ponteiro

*(v+3)

3 - Uso de subscritos com ponteiros vPtr[3] 4 - Ponteiro/deslocamento com um ponteiro *(vPtr+3)

Note que a expressão v = v+3 é incorreta porque v é um ponteiro constante, seu valor não deverá ser modificado, sempre deverá apontar para o primeiro elemento do array.

1Um ponteiro constante é aquele cujo valor não pode ser modificado. 2 Subscritos são [].

(8)

6. Arrays de ponteiros

Arrays de ponteiros são arrays cujos elementos são ponteiros. Um uso muito comum de arrays de ponteiros são os arrays de strings.

No programa da Figura 8 é apresentado um array de strings que armazena os dias da semana. Na declaração da variável diaSemana, a parte diaSemana[7] indica que é um vetor de 7 elementos. A parte char * indica que cada elemento do vetor é do tipo "ponteiro para caracter".

1 int main() 2 {

3 char *diaSemana[7] = {"Domingo", "Segunda-feira", "Terca-feira",

4 "Quarta-feira", "Quinta-feira", "Sexta-feira", 5 "Sabado"}

6 int i;

7

8 for(i=0; i<7; i++)

9 cout << diaSemana[i] << endl;

10

11 return 0; 12 }

Figura 8. Um programa com várias operações aritméticas de ponteiros.

Referências

Documentos relacionados

Visto que o Código de Defesa do Consumidor – CDC (Lei nº 8.078/1990), em seu artigo 4º, traz como objetivo “o atendimento das necessidades dos consumidores, o respeito à

G.B. Foram produzidos 48 corpos de prova em triplicata para a realização de ensaios de compressão axial e “slump test” com período de cura de 3, 7, 14 e 28 dias. Os corpos de

Um balanço dos três anos de atendimento do Programa de Proteção a Crianças e Adolescentes Ameaçados de Morte (PPCAM), divulgado pela ONG Projeto Legal, mostra que o

Nesse sentido visando à problemática do êxodo rural de jovem cada vez maior, assim sendo o problema de pesquisa a ser debatido será: Quais são os motivos e as expectativas que levam

1.1 O presente Termo de Referência tem por objeto a contratação de empresa especializada para prestação de serviços de higienização, limpeza, manutenção

Assim, nossa preocupação continua sendo você, estudante, a quem dedicamos mais Assim, nossa preocupação continua sendo você, estudante, a quem dedicamos mais esta obra,

– variáveis tipo int recebem apenas valores inteiros – variáveis tipo float armazenam apenas

Para fins de gestão, os recursos materiais, em sentido amplo, podem ainda ser classificados em duas subcategorias: os recursos materiais em sentido estrito que