В этом уроке мы узнаем о связи между массивами и указателями с помощью примеров.
В 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 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
Вот,
-
Сначала мы использовали обозначение указателя, чтобы сохранить числа, введенные пользователем, в массив arr.
cin>> *(arr + i) ;
Этот код эквивалентен приведенному ниже коду:
cin>> arr(i);
Обратите внимание, что мы не объявили отдельную переменную-указатель, а скорее используем имя массива arr для обозначения указателя.
Как мы уже знаем, имя массива arr указывает на первый элемент массива. Итак, мы можем рассматривать arr как указатель.
-
Точно так же мы затем использовали
for
цикл для отображения значений arr с использованием обозначения указателя.cout << *(arr + i) << endl ;
Этот код эквивалентен
cout << arr(i) << endl ;