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 ;

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