Ponteiros e matrizes C++
Ponteiros e matrizes C++
Neste tutorial, aprenderemos sobre a relação entre arrays e ponteiros com a ajuda de exemplos.
Em C++, Ponteiros são variáveis que contêm endereços de outras variáveis. Não só um ponteiro pode armazenar o endereço de uma única variável, ele também pode armazenar o endereço das células de um array.
Considere este exemplo:
int *ptr;
int arr[5];
// store the address of the first
// element of arr in ptr
ptr = arr;
Aqui, ptr é uma variável de ponteiro enquanto arr é um
int
variedade. O código ptr = arr;
armazena o endereço do primeiro elemento do array na variável ptr . Observe que usamos
arr
em vez de &arr[0]
. Isso porque ambos são iguais. Portanto, o código abaixo é o mesmo que o código acima.
int *ptr;
int arr[5];
ptr = &arr[0];
Os endereços para o resto dos elementos do array são dados por
&arr[1]
, &arr[2]
, &arr[3]
e &arr[4]
. Apontar para todos os elementos da matriz
Suponha que precisamos apontar para o quarto elemento do array usando o mesmo ponteiro ptr .
Aqui, se ptr aponta para o primeiro elemento no exemplo acima e então
ptr + 3
apontará para o quarto elemento. Por exemplo,
int *ptr;
int arr[5];
ptr = arr;
ptr + 1 is equivalent to &arr[1];
ptr + 2 is equivalent to &arr[2];
ptr + 3 is equivalent to &arr[3];
ptr + 4 is equivalent to &arr[4];
Da mesma forma, podemos acessar os elementos usando o ponteiro único. Por exemplo,
// use dereference operator
*ptr == arr[0];
*(ptr + 1) is equivalent to arr[1];
*(ptr + 2) is equivalent to arr[2];
*(ptr + 3) is equivalent to arr[3];
*(ptr + 4) is equivalent to arr[4];
Suponha que inicializamos
ptr = &arr[2];
então
ptr - 2 is equivalent to &arr[0];
ptr - 1 is equivalent to &arr[1];
ptr + 1 is equivalent to &arr[3];
ptr + 2 is equivalent to &arr[4];

Observação: O endereço entre ptr e ptr + 1 difere em 4 bytes. É porque ptr é um ponteiro para um
int
dados. E o tamanho de int é de 4 bytes em um sistema operacional de 64 bits. Da mesma forma, se o ponteiro ptr está apontando para
char
digite data, então o endereço entre ptr e ptr + 1 é 1 byte. É porque o tamanho de um caractere é de 1 byte. Exemplo 1:ponteiros e matrizes C++
// C++ Program to display address of each element of an array
#include <iostream>
using namespace std;
int main()
{
float arr[3];
// declare pointer variable
float *ptr;
cout << "Displaying address using arrays: " << endl;
// use for loop to print addresses of all array elements
for (int i = 0; i < 3; ++i)
{
cout << "&arr[" << i << "] = " << &arr[i] << endl;
}
// ptr = &arr[0]
ptr = arr;
cout<<"\nDisplaying address using pointers: "<< endl;
// use for loop to print addresses of all array elements
// using pointer notation
for (int i = 0; i < 3; ++i)
{
cout << "ptr + " << i << " = "<< ptr + i << endl;
}
return 0;
}
Saída
Displaying address using arrays: &arr[0] = 0x61fef0 &arr[1] = 0x61fef4 &arr[2] = 0x61fef8 Displaying address using pointers: ptr + 0 = 0x61fef0 ptr + 1 = 0x61fef4 ptr + 2 = 0x61fef8
No programa acima, primeiro simplesmente imprimimos os endereços dos elementos do array sem usar a variável de ponteiro ptr .
Em seguida, usamos o ponteiro ptr para apontar para o endereço de a[0] ,
ptr + 1
para apontar para o endereço de a[1] , e assim por diante. Na maioria dos contextos, os nomes dos arrays decaem para ponteiros. Em palavras simples, os nomes dos arrays são convertidos em ponteiros. Essa é a razão pela qual podemos usar ponteiros para acessar elementos de arrays.
No entanto, devemos lembrar que ponteiros e arrays não são a mesma coisa.
Existem alguns casos em que os nomes de matrizes não se transformam em ponteiros. Para saber mais, visite:Quando o nome do array não decai em um ponteiro?
Exemplo 2:nome do array usado como ponteiro
// C++ Program to insert and display data entered by using pointer notation.
#include <iostream>
using namespace std;
int main() {
float arr[5];
// Insert data using pointer notation
cout << "Enter 5 numbers: ";
for (int i = 0; i < 5; ++i) {
// store input number in arr[i]
cin >> *(arr + i) ;
}
// Display data using pointer notation
cout << "Displaying data: " << endl;
for (int i = 0; i < 5; ++i) {
// display value of arr[i]
cout << *(arr + i) << endl ;
}
return 0;
}
Saída
Enter 5 numbers: 2.5 3.5 4.5 5 2 Displaying data: 2.5 3.5 4.5 5 2
Aqui,
-
Primeiro usamos a notação de ponteiro para armazenar os números inseridos pelo usuário no array arr .
cin >> *(arr + i) ;
Este código é equivalente ao código abaixo:
cin >> arr[i];
Observe que não declaramos uma variável de ponteiro separada, mas estamos usando o nome do array arr para a notação de ponteiro.
Como já sabemos, o nome do array arr aponta para o primeiro elemento da matriz. Então, podemos pensar em arr agindo como um ponteiro.
-
Da mesma forma, usamosfor
loop para exibir os valores de arr usando notação de ponteiro.
cout << *(arr + i) << endl ;
Este código é equivalente a
cout << arr[i] << endl ;
Linguagem C
- Variáveis, literais e constantes de C++
- Classes e objetos C++
- Gerenciamento de memória C++:novo e excluir
- Herança pública, protegida e privada C++
- Função de amigo C++ e classes de amigo
- Ponteiros C
- Relação entre arrays e ponteiros
- Endereços e ponteiros de passagem C
- Estruturas e ponteiros C
- Estruturas e classes em C ++