pointers pointer operations c
İşaretçilerin ve C ++ 'daki Kullanımlarının Yoğun Bir Çalışması.
İşaretçi, C ++ dilinin en güçlü özelliklerinden biridir. Bir işaretçi, değişkenleri adresleri aracılığıyla değiştirmeye yardımcı olur.
python mülakat soruları ve testçiler için cevaplar
Bu eğitimde, işaretçiler ve C ++ 'daki kullanımları hakkında ayrıntılı olarak her şeyi keşfedeceğiz.
=> Burada Basit C ++ Eğitim Serisine Dikkat Edin.
Ne öğreneceksin:
- İşaretçi Nedir?
- İşaretçi Aritmetiği
- Null And Void işaretçileri
- Diziler ve İşaretçiler
- İşaretçiler Dizisi
- İşaretçilerin İşaretçisi
- İşaretçileri İşlevlere Aktarma
- İşlev İşaretçileri
- Sonuç
- Önerilen Kaynaklar
İşaretçi Nedir?
İşaretçi, bir bellek konumunun adresini tutan bir değişkendir. Bildirdiğimiz tüm değişkenlerin bellekte belirli bir adrese sahip olduğunu biliyoruz. Bellekteki bu adresleri işaret edecek bir işaretçi değişkeni tanımlıyoruz.
Bir işaretçi değişkeni bildirmek için genel sözdizimi şöyledir:
datatype * variable_name;
Örneğin, Deklarasyon int * ptr;
Bu, ptr'nin int türünde bir değişkene işaret eden bir işaretçi olduğu anlamına gelir. Dolayısıyla, bir işaretçi değişkeni her zaman bir bellek konumu veya adresi içerir. Aşağıda işaretçi değişkenlerinin çalışmasını görelim.
Aşağıdaki beyanlarımız olduğunu düşünün:
Int p, *ptr; //declare variable p and pointer variable ptr p = 4; //assign value 4 to variable p ptr = &p; //assign address of p to pointer variable ptr
Hafızada, bu bildirimler aşağıdaki gibi temsil edilecektir:
Bu, bellekteki göstericinin dahili temsilidir. Adres değişkenini işaretçi değişkenine atadığımızda, yukarıdaki gösterimde gösterildiği gibi değişkeni işaret eder.
Ptr, p değişkeninin bir adresine sahip olduğundan, * ptr, p değişkeninin değerini verecektir (ptr gösterici değişkeninin işaret ettiği değişken).
Not: İşaretçi ile kullandığımız * operatörü, bir işaretçi değişkeni olduğunu belirtmek için kullanılır.
C ++ 'da kullanılan bazı işaretçi kavramlarını görelim.
İşaretçi Aritmetiği
Bir işaretçi değişkeninin her zaman bellekteki adresi gösterdiğini biliyoruz. Yapabileceğimiz işlemler arasında işaretçiler üzerinde gerçekleştirilen aşağıdaki aritmetik işlemler bulunmaktadır.
- Arttırma operatörü (++)
- Azaltma operatörü (-)
- Toplama (+)
- Çıkarma (-)
Bu işlemlerin kullanımını bir Örnek programda görelim.
#include #include using namespace std; int main() { int myarray(5) = {2, 4,6, 8,10}; int* myptr; myptr = myarray; cout<<'First element in the array :'<<*myptr< Çıktı:
Dizideki ilk öğe: 2
dizideki sonraki eleman: 4
dizideki sonraki eleman: 6
dizideki sonraki eleman: 4
dizideki sonraki öğe: 2
İşaretçiler üzerinde gerçekleştirilen aritmetik işlemleri gördük. Arttırma operatörünün ++ işaretçiyi artırdığını ve dizideki sonraki öğeyi gösterdiğini unutmayın. Benzer şekilde, azaltma operatörü, işaretçi değişkenini dizideki önceki öğeyi gösterecek şekilde 1 azaltır.
+ Ve - operatörlerini de kullanıyoruz. İlk olarak, işaretçi değişkenine 1 ekledik. Sonuç, dizideki bir sonraki öğeyi işaret ettiğini gösterir. Benzer şekilde, - operatörü, işaretçi değişkeninin dizideki önceki öğeyi göstermesini sağlar.
Bu aritmetik işleçlerin yanı sıra, ==, gibi karşılaştırma işleçlerini de kullanabiliriz.
Null And Void işaretçileri
Bir gösterici değişkenine bir değişkenin adresi atanmamışsa, işaret değişkenine bir NULL değeri atamak iyi bir uygulamadır. NULL değerine sahip işaretçi değişkenine NULL işaretçisi denir.
Boş gösterici, iostream başlığında tanımlanan sıfır değerine sahip sabit bir göstericidir. 0 adresindeki bellek işletim sistemi tarafından ayrılmıştır ve bu konuma erişemiyoruz.
.eps dosyaları nasıl görüntülenir
Boş gösterici kullanarak, kullanılmayan işaretçilerin kötüye kullanılmasını önleyebilir ve işaretçi değişkenlerinin kendilerine atanmış bazı gereksiz değerlere sahip olmasını önleyebiliriz.
Void işaretçileri, türü olmayan değerlere işaret eden özel işaretçilerdir. Boşluk işaretçileri, herhangi bir türe işaret edebildikleri için daha esnektir. Ancak doğrudan referans alınamaz. Başvuruyu iptal etmek için, boşluk işaretçisinin somut veri türüne sahip bir değere işaret eden bir işaretçiye dönüştürülmesi gerekir.
Aşağıdaki kod Örnekte NULL işaretçisi ve void işaretçisinin çalışmasını gösterdik.
#include #include using namespace std; int main() { int intvar = 10; char c = 'A'; void* vptr; int* myptr = NULL; cout<<'NULL pointer value :'< Çıktı:
NULL işaretçi değeri: 0
Void işaretçisi vptr şunlara işaret eder: A
Void pointer vptr şunlara işaret eder: 10
Yukarıdaki programda, ilk olarak, NULL değeri atanmış bir tamsayı işaretçisi bildiriyoruz. Bu işaretçiyi yazdırdığımızda, daha önce tartıştığımız gibi değerin 0 olduğunu görürüz.
Sonra, bir boşluk gösterici ilan ediyoruz. İlk olarak, bu boşluk işaretçisine bir karakter değişkeninin adresini atıyoruz. Sonra bir karakter işaretçisine void işaretçisi atayıp char * ile yazıyoruz. Daha sonra, daha önce bildirdiğimiz ve void gösterici ile gösterilen bir karakter değişkeni olan char A'ya işaret eden bir charptr değeri yazdırıyoruz.
Daha sonra, boşluk göstericisine bir tamsayı değişkeni atadık ve daha sonra bir tamsayı işaretçisi kullanarak bu boşluk göstericisini referans almanın aynı adımlarını gerçekleştiriyoruz.
Diziler ve İşaretçiler
Diziler ve işaretçiler birbirleriyle güçlü bir şekilde ilişkilidir. Dizinin adının dizideki ilk elemanı gösterdiğini biliyoruz ve bu sabit bir gösterici.
Bu işaretçiyi bir işaretçi değişkenine atayabilir ve ardından diziye işaretçiyi azaltarak veya indis operatörünü kullanarak erişebiliriz.
İşaretçi değişkeni ile dizi arasındaki bu ilişkiyi aşağıdaki kodda göreceğiz Örnek.
#include #include using namespace std; int main() { int myarray(5) = {1, 1, 2, 3, 5}; int* ptrvar; ptrvar = myarray; for(int i=0;i<5;i++) { cout<<*ptrvar<<' '; ptrvar++; } return 0; }
Çıktı:
1 1 2 3 5
Yukarıdaki programda, dizi adını bir işaretçi değişkenine atıyoruz. Dizi adı dizideki ilk elemanı gösterdiğinden, tüm dizinin içeriğini bir işaretçi değişkeni kullanarak yazdırabilir ve ++ operatörünü kullanarak artırabiliriz. Bu çıktıda gösterilir.
İşaretçiler Dizisi
Bazen, bir programda birden fazla işaretçi değişkenine ihtiyacımız olur. Her bir işaretçi değişkenini bildirmek yerine, bir işaretçi dizisi tanımlayabiliriz.
Bir dizi işaretçi göstermek için hemen bir Örnek alalım.
#include #include using namespace std; int main() { int myarray(5) = {2,4,6,8,10}; int *ptr(5); //array of pointers for(int i=0;i<5;i++){ ptr(i) = &myarray(i); } for (int i = 0; i < 5; i++) { cout << 'Value of myarray(' << i << ') = '; cout << *ptr(i) << endl; } return 0; }
Çıktı:
Myarray (0) = 2 değeri
Myarray (1) = 4 değeri
Myarray (2) = 6 değeri
Myarray (3) = 8 değeri
Myarray (4) = 10 değeri
Yukarıdaki beyanda,
int * ptr (5);
Şöyle yorumlayabiliriz; ptr, 5 tamsayı işaretçisi dizisidir. Dolayısıyla, ptr'nin her bir öğesi tamsayı türünde bir değişkene işaret edecektir.
Bir tamsayı dizisi kullanıyoruz ve dizinin her bir elemanının adresini ptr elemanlarının her birine atıyoruz. Daha sonra “* ptr (i)” çıktısını alarak ptr dizisinin içeriğini görüntüleriz.
İşaretçilerin İşaretçisi
İşaretçilerin işaretçisi, çoklu indirimlerden başka bir şey değildir. Bir tür işaretçiler zinciridir. Bir işaretçi işaretçisi tanımladığımızda, ilk işaretçi ikinci işaretçinin bir adresine sahip olur ve bu da işaret ettiği değişkenin adresine sahiptir.
Hafızada bu şu şekilde temsil edilecektir:

Bir işaretçi aşağıdaki gibi bildirilir:
int** intptr;
İşaretçilerin işaretçisini daha iyi anlamak için doğrudan bir kod örneği alıyoruz.
#include #include using namespace std; int main() { int *vptr; int ** intptr; int var = 10; vptr = &var; intptr = &vptr; cout<<'Variable var: '< Çıktı:
Değişken değişken: 10
İşaretçiden Değişkene: 10
İşaretçiden bir değişkene: 10
Yukarıdaki programda, bir tamsayı değişkeni, bir tamsayı işaretçisi ve bir tamsayı için bir gösterici tanımlıyoruz. Programda gösterildiği gibi, işaretçi değişkenine bir değişkenin değeri atanır. İşaretçi değişkeninin işaretçisine, işaretçi değişkeninin adresi atanır.
Sonunda, aynı 10 değerini bir tamsayı değişkenine eşit olarak gösteren üç değişkeni yazdırıyoruz.
İşaretçileri İşlevlere Aktarma
İşaretçileri işleve geçirmek, işleve işaretçi değişkenlerini ilettiğimiz diğer parametre geçirme teknikleriyle aynıdır.
İki değeri değiştirmemizi yeniden ziyaret ediyoruz ve işaretçi değişkenlerini parametre olarak geçirmek için değiştiriyoruz.
#include #include using namespace std; void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } int main() { int a, b; cout<>a>>b; cout<<'a = '< Çıktı:
Değiştirilecek değerleri girin: 3 2
a = 3 b = 2
Değiştirilen değerler
a = 2 b = 3
Programda gösterildiği gibi, değiş tokuş edilecek değerleri tamsayı değişkenleri olarak geçiriyoruz. Biçimsel parametreler işaretçi değişkenleri olarak tanımlanır. Bunun bir sonucu olarak, fonksiyonların içindeki değişkenlerde yapılan değişiklikler, çağıran fonksiyonda da dışarıya yansıtılır.
İşlev İşaretçileri
aynı şekilde, değişkenlere, dizilere vb. işaretçilerimiz olduğu gibi, işlevlere de işaretçilerimiz olabilir. Ancak fark, işlev göstericisinin değişkenler veya diziler gibi verilere değil, çalıştırılabilir koda işaret etmesidir.
Fonksiyon işaretlerini göstermek için bir Örnek alıyoruz.
#include #include using namespace std; void displayVal(int a) { printf('Value of a is %d
', a); } int main() { void (*func_ptr)(int) = &displayVal; (*func_ptr)(100); return 0; }
Çıktı:
A'nın değeri 100'dür
Bir uygulamadaki tüm programların birlikte düzgün çalıştığını doğrulamak için hangi tür test kullanılır?
Yukarıdaki programda, kendisine aktarılan bir tamsayı değerini yazdıran bir 'displayVal' fonksiyonumuz var. Ana işlevde, bağımsız değişken olarak bir int alan ve bir void türü döndüren bir işlev işaretçisi 'func_ptr' tanımladık.
geçersiz (* func_ptr) (int)
Not: Fonksiyon göstericisini () içine almamız gerekiyor. Atlarsak, bir fonksiyon prototipi haline gelecektir.
Bu işlev işaretçisine 'displayVal' işlevinin adresini atadık. Sonra bu işlev işaretçisini 'func_ptr' kullanarak, argüman 100 ile displayVal'ı çağırmaya eşdeğer olan argüman değeri 100'ü iletiriz.
Şimdi, aynı prototipe sahip başka bir fonksiyonumuz varsa, o zaman fonksiyonun adresini ona atayarak aynı fonksiyon işaretçisini kullanabiliriz. Bu, işlev işaretçilerinin başlıca kullanımıdır.
Sonuç
Bu, C ++ 'daki işaretçiler, tanımları ve kullanımları ile ilgilidir.
Bir sonraki eğitimimizde, C ++ 'daki referanslar hakkında daha fazla bilgi edineceğiz. Referansların ayrıca C ++ 'da özel kullanımı vardır ve genellikle değişkenler için takma ad olarak kullanılır.
=> Absolute C ++ Eğitim Serisi İçin Tıklayınız.
Önerilen Kaynaklar