Wskaźniki i tablice w C ++

W tym samouczku nauczymy się relacji między tablicami i wskaźnikami na przykładach.

W C ++ wskaźniki są zmiennymi, które przechowują adresy innych zmiennych. Wskaźnik nie tylko może przechowywać adres pojedynczej zmiennej, ale może również przechowywać adresy komórek tablicy.

Rozważmy ten przykład:

 int *ptr; int arr(5); // store the address of the first // element of arr in ptr ptr = arr;

W tym przypadku ptr jest zmienną wskaźnikową, podczas gdy arr jest inttablicą. Kod ptr = arr;przechowuje adres pierwszego elementu tablicy w zmiennej ptr.

Zauważ, że użyliśmy arrzamiast &arr(0). Dzieje się tak, ponieważ oba są takie same. Zatem poniższy kod jest taki sam jak powyższy kod.

 int *ptr; int arr(5); ptr = &arr(0);

Adresy pozostałych elementów tablicy podane są &arr(1), &arr(2), &arr(3)i &arr(4).

Wskaż każdy element tablicy

Załóżmy, że musimy wskazać czwarty element tablicy za pomocą tego samego wskaźnika ptr.

Tutaj, jeśli ptr wskazuje na pierwszy element w powyższym przykładzie ptr + 3, wskaże czwarty element. Na przykład,

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

Podobnie możemy uzyskać dostęp do elementów za pomocą pojedynczego wskaźnika. Na przykład,

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

Załóżmy, że jeśli mamy zainicjowany ptr = &arr(2);następnie

 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);
Praca wskaźników C ++ z tablicami

Uwaga: Adres między ptr i ptr + 1 różni się o 4 bajty. Dzieje się tak, ponieważ ptr jest wskaźnikiem do intdanych. Rozmiar int wynosi 4 bajty w 64-bitowym systemie operacyjnym.

Podobnie, jeśli wskaźnik ptr wskazuje chartyp danych, to adres między ptr i ptr + 1 wynosi 1 bajt. Dzieje się tak, ponieważ rozmiar znaku wynosi 1 bajt.

Przykład 1: wskaźniki i tablice w 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; )

Wynik

 Wyświetlanie adresu za pomocą tablic: & arr (0) = 0x61fef0 & arr (1) = 0x61fef4 & arr (2) = 0x61fef8 Wyświetlanie adresu za pomocą wskaźników: ptr + 0 = 0x61fef0 ptr + 1 = 0x61fef4 ptr + 2 = 0x61fef8

W powyższym programie najpierw po prostu wydrukowaliśmy adresy elementów tablicy bez użycia zmiennej wskaźnikowej ptr.

Następnie użyliśmy wskaźnika ptr, aby wskazać adres a (0), ptr + 1wskazać adres a (1) i tak dalej.

W większości kontekstów nazwy tablic rozpadają się na wskaźniki. Mówiąc prościej, nazwy tablic są konwertowane na wskaźniki. To jest powód, dla którego możemy używać wskaźników, aby uzyskać dostęp do elementów tablic.

Należy jednak pamiętać, że wskaźniki i tablice to nie to samo.

Jest kilka przypadków, w których nazwy tablic nie rozpadają się na wskaźniki. Aby dowiedzieć się więcej, odwiedź: Kiedy nazwa tablicy nie zamienia się we wskaźnik?

Przykład 2: nazwa tablicy używana jako wskaźnik

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

Wynik

 Wprowadź 5 liczb: 2,5 3,5 4,5 5 2 Wyświetlanie danych: 2,5 3,5 4,5 5 2

Tutaj,

  1. Najpierw użyliśmy notacji wskaźnikowej do przechowywania liczb wprowadzonych przez użytkownika w tablicy arr.

     cin>> *(arr + i) ;

    Ten kod jest równoważny z kodem poniżej:

     cin>> arr(i);

    Zwróć uwagę, że nie zadeklarowaliśmy osobnej zmiennej wskaźnika, ale zamiast tego używamy nazwy tablicy arr jako notacji wskaźnika.

    Jak już wiemy, nazwa tablicy arr wskazuje na pierwszy element tablicy. Tak więc możemy myśleć o arras jako o działaniu wskaźnika.

  2. Podobnie, użyliśmy forpętli do wyświetlenia wartości arr przy użyciu notacji wskaźnikowej.

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

    Ten kod jest równoważny z

     cout << arr(i) << endl ;

Interesujące artykuły...