Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Указатели и массивы C++

Указатели и массивы C++

В этом уроке мы узнаем о связи между массивами и указателями с помощью примеров.

В C++ указатели — это переменные, содержащие адреса других переменных. Указатель может хранить не только адрес одной переменной, но и адрес ячеек массива.

Рассмотрим этот пример:

int *ptr;
int arr[5];

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

Здесь ptr является переменной-указателем, а arr это int множество. Код ptr = arr; сохраняет адрес первого элемента массива в переменной ptr .

Обратите внимание, что мы использовали arr вместо &arr[0] . Это потому, что оба одинаковы. Таким образом, приведенный ниже код аналогичен коду выше.

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

Адреса остальных элементов массива задаются как &arr[1] , &arr[2] , &arr[3] и &arr[4] .

<час>

Указать на каждый элемент массива

Допустим, нам нужно указать на четвертый элемент массива с помощью того же указателя ptr .

Здесь, если ptr указывает на первый элемент в приведенном выше примере, затем ptr + 3 будет указывать на четвертый элемент. Например,

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

Точно так же мы можем получить доступ к элементам с помощью одного указателя. Например,

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

Предположим, если мы инициализировали ptr = &arr[2]; затем

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];
<рисунок>

Примечание. Адрес между ptr и ptr + 1 отличается на 4 байта. Это потому, что ptr указатель на int данные. И размер int составляет 4 байта в 64-разрядной операционной системе.

Точно так же, если указатель ptr указывает на char введите данные, затем адрес между ptr и ptr + 1 составляет 1 байт. Это потому, что размер символа составляет 1 байт.

<час>

Пример 1. Указатели и массивы 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;
}

Вывод

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

В приведенной выше программе мы сначала просто напечатали адреса элементов массива, не используя переменную-указатель ptr. .

Затем мы использовали указатель ptr чтобы указать на адрес a[0] , ptr + 1 чтобы указать на адрес a[1] и т. д.

<час>

В большинстве случаев имена массивов превращаются в указатели. Проще говоря, имена массивов преобразуются в указатели. Вот почему мы можем использовать указатели для доступа к элементам массивов.

Однако мы должны помнить, что указатели и массивы — это не одно и то же.

Есть несколько случаев, когда имена массивов не распадаются на указатели. Чтобы узнать больше, посетите:Когда имя массива не распадается на указатель?

<час>

Пример 2. Имя массива, используемое в качестве указателя

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

Вывод

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

Здесь

  1. Сначала мы использовали нотацию указателя для хранения чисел, введенных пользователем, в массив arr. .

    cin >> *(arr + i) ;

    Этот код эквивалентен приведенному ниже коду:

    cin >> arr[i];

    Обратите внимание, что мы не объявляли отдельную переменную-указатель, а используем имя массива arr. для обозначения указателя.

    Как мы уже знаем, имя массива arr указывает на первый элемент массива. Итак, мы можем думать о arr действует как указатель.

  2. Точно так же мы использовали for цикл для отображения значений arr используя нотацию указателя.

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

    Этот код эквивалентен

    cout << arr[i] << endl ;

Язык C

  1. Переменные C++, литералы и константы
  2. Классы и объекты С++
  3. Управление памятью C++:создание и удаление
  4. Публичное, защищенное и частное наследование C++
  5. Дружественные функции C++ и дружественные классы
  6. C указатели
  7. Связь между массивами и указателями
  8. C Pass адреса и указатели
  9. C-структуры и указатели
  10. Структуры и классы в C ++