Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

Punteros y arreglos de C++

Punteros y matrices de C++

En este tutorial, aprenderemos sobre la relación entre matrices y punteros con la ayuda de ejemplos.

En C++, los punteros son variables que contienen direcciones de otras variables. Un puntero no solo puede almacenar la dirección de una sola variable, sino que también puede almacenar la dirección de las celdas de una matriz.

Considere este ejemplo:

int *ptr;
int arr[5];

// store the address of the first
// element of arr in ptr
ptr = arr;

Aquí, ptr es una variable de puntero mientras que arr es un int formación. El código ptr = arr; almacena la dirección del primer elemento del arreglo en la variable ptr .

Note que hemos usado arr en lugar de &arr[0] . Esto se debe a que ambos son iguales. Entonces, el código de abajo es el mismo que el código de arriba.

int *ptr;
int arr[5];
ptr = &arr[0];

Las direcciones para el resto de los elementos de la matriz están dadas por &arr[1] , &arr[2] , &arr[3] y &arr[4] .


Apuntar a todos los elementos del arreglo

Supongamos que necesitamos apuntar al cuarto elemento de la matriz usando el mismo puntero ptr .

Aquí, si ptr apunta al primer elemento en el ejemplo anterior y luego ptr + 3 apuntará al cuarto elemento. Por ejemplo,

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];

Del mismo modo, podemos acceder a los elementos utilizando el puntero único. Por ejemplo,

// 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];

Supongamos que hemos inicializado ptr = &arr[2]; entonces

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];

Nota: La dirección entre ptr y ptr + 1 difiere en 4 bytes. Es porque ptr es un puntero a un int datos. Y el tamaño de int es de 4 bytes en un sistema operativo de 64 bits.

De manera similar, si el puntero ptr está apuntando a char escriba data, luego la dirección entre ptr y ptr + 1 es de 1 byte. Es porque el tamaño de un carácter es de 1 byte.


Ejemplo 1:punteros y matrices de 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;
}

Salida

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

En el programa anterior, primero simplemente imprimimos las direcciones de los elementos de la matriz sin usar la variable de puntero ptr .

Luego, usamos el puntero ptr para apuntar a la dirección de a[0] , ptr + 1 para apuntar a la dirección de a[1] , y así sucesivamente.


En la mayoría de los contextos, los nombres de las matrices se convierten en punteros. En palabras simples, los nombres de las matrices se convierten en punteros. Esa es la razón por la que podemos usar punteros para acceder a los elementos de las matrices.

Sin embargo, debemos recordar que los punteros y las matrices no son lo mismo.

Hay algunos casos en los que los nombres de las matrices no se convierten en punteros. Para obtener más información, visite:¿Cuándo el nombre de la matriz no se convierte en un puntero?


Ejemplo 2:nombre de matriz utilizado como puntero

// 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;
}

Salida

Enter 5 numbers: 2.5
3.5
4.5
5
2
Displaying data: 
2.5
3.5
4.5
5
2

Aquí,

  1. Primero usamos la notación de puntero para almacenar los números ingresados ​​por el usuario en la matriz arr .

    cin >> *(arr + i) ;

    Este código es equivalente al siguiente código:

    cin >> arr[i];

    Tenga en cuenta que no hemos declarado una variable de puntero separada, sino que estamos usando el nombre de matriz arr para la notación de puntero.

    Como ya sabemos, el nombre de la matriz arr apunta al primer elemento de la matriz. Entonces, podemos pensar en arr actuando como un puntero.

  2. De manera similar, luego usamos for bucle para mostrar los valores de arr usando notación de puntero.

    cout << *(arr + i) << endl ;

    Este código es equivalente a

    cout << arr[i] << endl ;

Lenguaje C

  1. Variables, literales y constantes de C++
  2. Clases y objetos de C++
  3. Gestión de memoria C++:nuevo y eliminar
  4. Herencia pública, protegida y privada de C++
  5. Función amiga de C++ y Clases amigas
  6. Punteros C
  7. Relación entre matrices y punteros
  8. Direcciones y punteros de C Pass
  9. Estructuras C y punteros
  10. Estructuras y clases en C ++
  11. Matrices en C++ | Declarar | Inicializar | Ejemplos de puntero a matriz