Указатели и массивы 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);
Работа указателей C ++ с массивами

Примечание . Адрес между 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 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<<"Displaying 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; )

Вывод

 Отображение адреса с использованием массивов: & arr (0) = 0x61fef0 & arr (1) = 0x61fef4 & arr (2) = 0x61fef8 Отображение адреса с использованием указателей: 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 using namespace std; int main() ( float arr(5); // Insert data using pointer notation cout << "Enter 5 numbers: "; for (int i = 0; i > *(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; )

Вывод

 Введите 5 цифр: 2,5 3,5 4,5 5 2 Отображение данных: 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 ;

Интересные статьи...