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