Bu eğitimde, örnekler yardımıyla diziler ve işaretçiler arasındaki ilişkiyi öğreneceğiz.
C ++ 'da İşaretçiler, diğer değişkenlerin adreslerini tutan değişkenlerdir. Bir işaretçi yalnızca tek bir değişkenin adresini saklamakla kalmaz, aynı zamanda bir dizinin hücrelerinin adresini de depolayabilir.
Şu örneği düşünün:
int *ptr; int arr(5); // store the address of the first // element of arr in ptr ptr = arr;
Burada, ptr bir işaretçi değişkeni iken, dizi bir int
dizidir. Kod ptr = arr;
, dizinin ilk elemanının adresini değişken ptr'de depolar.
arr
Bunun yerine kullandığımıza dikkat edin &arr(0)
. Bunun nedeni her ikisinin de aynı olmasıdır. Dolayısıyla, aşağıdaki kod yukarıdaki kodla aynıdır.
int *ptr; int arr(5); ptr = &arr(0);
Dizi, geri kalan elemanlar adresleri ile verilir &arr(1)
, &arr(2)
, &arr(3)
ve &arr(4)
.
Her Dizi Öğesini Göster
Aynı ptr işaretçisini kullanarak dizinin dördüncü elemanını göstermemiz gerektiğini varsayalım.
Burada, ptr yukarıdaki örnekteki ilk öğeyi gösteriyorsa, o ptr + 3
zaman dördüncü öğeyi gösterecektir. Örneğin,
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);
Benzer şekilde, elementlere tek işaretçi kullanarak erişebiliriz. Örneğin,
// 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);
Biz başlatıldı varsa varsayalım ptr = &arr(2);
o zaman
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);

Not: ptr ile ptr + 1 arasındaki adres 4 bayt farklıdır. Bunun nedeni, ptr'nin bir int
veriye gösterici olmasıdır . Ve 64 bit işletim sisteminde int boyutu 4 bayttır.
Benzer şekilde, işaretçi ptr char
veri türünü işaret ediyorsa , ptr ile ptr + 1 arasındaki adres 1 bayttır. Bunun nedeni, bir karakterin boyutunun 1 bayt olmasıdır.
Örnek 1: C ++ İşaretçiler ve Diziler
// 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; )
Çıktı
Diziler kullanarak adres görüntüleme: & arr (0) = 0x61fef0 & arr (1) = 0x61fef4 & arr (2) = 0x61fef8 Adres işaretçileri kullanarak görüntüleme: ptr + 0 = 0x61fef0 ptr + 1 = 0x61fef4 ptr + 2 = 0x61fef8
Yukarıdaki programda, ilk önce ptr gösterici değişkenini kullanmadan basitçe dizi elemanlarının adreslerini yazdırdık.
Sonra, ptr işaretçisini a (0) ' ptr + 1
ın adresini, a (1)' in adresini vb. Göstermek için kullandık.
Çoğu bağlamda, dizi adları işaretçilere dönüşür. Basit bir deyişle, dizi adları işaretleyicilere dönüştürülür. Dizilerin öğelerine erişmek için işaretçileri kullanabilmemizin nedeni budur.
Ancak, işaretçilerin ve dizilerin aynı olmadığını unutmamalıyız.
Dizi adlarının işaretçiler haline gelmediği birkaç durum vardır. Daha fazla bilgi edinmek için şu adresi ziyaret edin: Dizi adı ne zaman bir işaretçiye dönüşmez?
Örnek 2: İşaretçi olarak kullanılan dizi adı
// 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; )
Çıktı
5 numara girin: 2,5 3,5 4,5 5 2 Veri görüntüleme: 2,5 3,5 4,5 5 2
Buraya,
-
İlk önce kullanıcı tarafından girilen sayıları dizi dizisine saklamak için işaretçi gösterimini kullandık.
cin>> *(arr + i) ;
Bu kod, aşağıdaki koda eşdeğerdir:
cin>> arr(i);
Ayrı bir işaretçi değişkeni tanımlamadığımıza dikkat edin, bunun yerine işaretçi gösterimi için dizi adını kullanıyoruz.
Bildiğimiz gibi dizi adı arr, dizinin ilk elemanına işaret ediyor. Yani arr'ı bir işaretçi gibi düşünebiliriz.
-
Benzer şekilde,
for
arr değerlerini gösterici notasyonu kullanarak görüntülemek için döngü kullandık.cout << *(arr + i) << endl ;
Bu kod eşdeğerdir
cout << arr(i) << endl ;