Örneklerle C ++ İşaretçiler

İçindekiler:

Anonim

İşaretçiler nedir?

C ++ 'da, bir işaretçi başka bir değişkenin adresini tutan bir değişkeni ifade eder. Normal değişkenler gibi, işaretçilerin de bir veri türü vardır. Örneğin, tamsayı türünde bir işaretçi, tamsayı türünde bir değişkenin adresini tutabilir. Karakter türündeki bir işaretçi, karakter türündeki bir değişkenin adresini tutabilir.

Bir işaretçi, bir bellek adresinin sembolik bir temsili olarak görmelisiniz. İşaretçilerle programlar çağrıya göre simüle edebilir. Ayrıca dinamik veri yapıları oluşturabilir ve işleyebilirler. C ++ 'da, bir işaretçi değişkeni, başka bir değişken tarafından işaret edilen bir bellekteki belirli bir adrese işaret eden bir değişkeni ifade eder.

Bu C ++ eğitiminde şunları öğreneceksiniz:

  • İşaretçiler nedir?
  • C ++ 'da adresler
  • İşaretçi Bildirimi Sözdizimi
  • Referans operatörü (&) ve Erteleme operatörü (*)
  • İşaretçiler ve Diziler
  • Boş işaretçisi
  • Değişkenlerin İşaretçileri
  • İşaretçilerin Uygulanması
  • İşaretçiler kullanmanın avantajları

C ++ 'da adresler

C ++ işaretleyicilerini anlamak için, bilgisayarların verileri nasıl depoladığını anlamalısınız.

C ++ programınızda bir değişken oluşturduğunuzda, buna bilgisayar belleğinde bir miktar alan atanır. Bu değişkenin değeri atanan yerde saklanır.

Verilerin depolandığı bilgisayar belleğindeki konumu bilmek için C ++, & (referans) operatörünü sağlar. Operatör, bir değişkenin kapladığı adresi döndürür.

Örneğin, x bir değişkense, & x değişkenin adresini döndürür.

İşaretçi Bildirimi Sözdizimi

C ++ bildirimi aşağıdaki sözdizimini alır:

datatype *variable_name;
  • Veri türü, geçerli bir C ++ veri türü olması gereken işaretçinin temel türüdür.
  • Değişken_adı, işaretçi değişkeninin adı olmalıdır.
  • Yukarıda işaretçi bildirimi için kullanılan yıldız işareti, çarpma işlemini gerçekleştirmek için kullanılan yıldız işaretine benzer. Değişkeni işaretçi olarak işaretleyen yıldız işaretidir.

C ++ 'da geçerli işaretçi bildirimlerine bir örnek:

int *x; // a pointer to integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *ch // a pointer to a character

Referans operatörü (&) ve Erteleme operatörü (*)

Referans operatörü (&), değişkenin adresini döndürür.

Dereference operatörü (*), bir bellek adresinde depolanan değeri elde etmemize yardımcı olur.

Örneğin:

Num adı verilen, 0x234 adresinde saklanan ve 28 değerini saklayan bir değişkenimiz varsa.

Referans operatörü (&) 0x234'ü döndürecektir.

Referans işleci (*) 5 değerini döndürecektir.

Örnek 1:

#include using namespace std;int main() {int x = 27;int *ip;ip = &x;cout << "Value of x is : ";cout << x << endl;cout << "Value of ip is : ";cout << ip<< endl;cout << "Value of *ip is : ";cout << *ip << endl;return 0;}

Çıktı:

Bu nasıl çalışır:

İşte kodun bir ekran görüntüsü:

Kod Açıklaması:

  1. Iostream başlık dosyasını içe aktarın. Bu, başlık dosyasında tanımlanan fonksiyonları hata almadan kullanmamızı sağlayacaktır.
  2. Sınıflarını çağırmadan kullanmak için std ad alanını dahil edin.
  3. Main () işlevini çağırın. Program mantığı bu işlevin gövdesine eklenmelidir. {, İşlevin gövdesinin başlangıcını gösterir.
  4. Bir tamsayı değişkeni x bildirin ve buna 27 değerini atayın.
  5. * İp işaretçi değişkeni bildirin.
  6. İşaretçi değişkeninde x değişkeninin adresini saklayın.
  7. Konsolda biraz metin yazdırın.
  8. X değişkeninin değerini ekrana yazdırın.
  9. Konsolda biraz metin yazdırın.
  10. X değişkeninin adresini yazdırın. Adresin değeri ip değişkeninde saklandı.
  11. Konsolda biraz metin yazdırın.
  12. İşaretçinin adresinde depolanan yazdırma değeri.
  13. Program başarılı bir şekilde yürütüldüğünde değer döndürmelidir.
  14. Main () işlevinin gövdesinin sonu.

İşaretçiler ve Diziler

Diziler ve işaretçiler ilgili bir kavrama göre çalışır. İşaretçilere sahip dizilerle çalışırken dikkat edilmesi gereken farklı şeyler vardır. Dizi adının kendisi, dizinin temel adresini belirtir. Bu, bir dizinin adresini bir işaretçiye atamak için ve işareti (&) kullanmamanız gerektiği anlamına gelir.

Örneğin:

p = arr;

Yukarıdakiler doğrudur çünkü dizi dizinin adresini temsil eder. İşte başka bir örnek:

p = &arr;

Yukarıdakiler yanlıştır.

Bir diziyi örtük olarak bir işaretçiye dönüştürebiliriz. Örneğin:

int arr [20];int * ip;

Aşağıda geçerli bir işlem var:

ip = arr;

Yukarıdaki açıklamadan sonra ip ve arr eşdeğer olacak ve mülkleri paylaşacaklar. Ancak ip'e farklı bir adres atanabilir, ancak arr'a hiçbir şey atayamayız.

Örnek 2:

Bu örnek, işaretçiler kullanılarak bir dizinin nasıl geçiş yapılacağını gösterir:

#include using namespace std;int main() {int *ip;int arr[] = { 10, 34, 13, 76, 5, 46 };ip = arr;for (int x = 0; x < 6; x++) {cout << *ip << endl;ip++;}return 0;}

Çıktı:

İşte kodun bir ekran görüntüsü:

Kod Açıklaması:

  1. Bir tamsayı işaretçi değişkeni ip bildirin.
  2. Arr adında bir dizi bildirin ve içinde 6 tamsayı saklayın.
  3. Arr'ı ip'e atayın. İp ve arr eşdeğeri olacaktır.
  4. Bir döngü oluşturun. Döngü değişkeni x, 0'dan 5'e kadar olan dizi öğeleri üzerinde yineleme yapmak için oluşturulmuştur.
  5. İşaretçi IP adresinde depolanan değerleri yazdırın. Yineleme başına bir değer döndürülür ve toplam 6 tekrar yapılır. Endl, bitiş çizgisi anlamına gelen bir C ++ anahtar kelimesidir. Bu eylem, her değer yazdırıldıktan sonra imleci bir sonraki satıra taşımanıza olanak tanır. Her değer ayrı bir satırda yazdırılacaktır.
  6. Her yinelemeden sonra işaretçiyi sonraki int konumuna taşımak için.
  7. Bir döngü için sonu.
  8. Program başarılı bir şekilde çalıştırıldığında bir şey döndürmelidir.
  9. Main () işlev gövdesinin sonu.

Boş işaretçisi

Atanacak kesin bir adres yoksa, işaretçi değişkenine bir NULL atanabilir. Beyanname sırasında yapılmalıdır. Böyle bir işaretçi boş gösterici olarak bilinir. Değeri sıfırdır ve iostream gibi birçok standart kitaplıkta tanımlanmıştır.

Örnek 3:

#include using namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}

Çıktı:

İşte kodun bir ekran görüntüsü:

Kod Açıklaması:

  1. Bir işaretçi değişkeni ip bildirin ve ona bir NULL değeri atayın.
  2. Konsolda bazı metinlerin yanında işaretçi değişkeni ip'in yazdırma değeri.
  3. Program başarılı bir şekilde tamamlandığında değer döndürmelidir.
  4. Main () işlevinin gövdesinin sonu.

Değişkenlerin İşaretçileri

C ++ ile verileri doğrudan bilgisayarın belleğinden değiştirebilirsiniz.

Hafıza alanı isteğe göre atanabilir veya yeniden atanabilir. Bu, İşaretçi değişkenleri tarafından mümkün kılınmıştır.

İşaretçi değişkenleri, bilgisayarın belleğinde başka bir değişken tarafından gösterilen belirli bir adresi gösterir.

Aşağıdaki gibi beyan edilebilir:

int *p;

Veya,

int* p;

Sizin örneğinizde, p işaretçi değişkenini tanımladık.

Bir hafıza adresi tutacaktır.

Yıldız işareti, işaretçi anlamına gelen referans operatördür.

P imleci, bellek adresindeki bir tamsayı değerine işaret etmektedir.

Örnek 4:

#include using namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}

Çıktı:

İşte kodun bir ekran görüntüsü:

Kod Açıklaması:

  1. Bir işaretçi değişkeni p ve 30 değerine sahip bir x değişkeni bildirin.
  2. X değişkeninin adresini p'ye atayın.
  3. Konsolda bazı metinlerin yanında p işaretçi değişkeninin değerini yazdırın.
  4. Program başarılı bir şekilde tamamlandığında değer döndürmelidir.
  5. Main () işlevinin gövdesinin sonu.

İşaretçilerin Uygulanması

C ++ 'daki işlevler yalnızca bir değer döndürebilir. Ayrıca, bir işlevde bildirilen tüm değişkenler, işlev çağrı yığınında tahsis edilir. İşlev geri döner dönmez, tüm yığın değişkenleri yok edilir.

İşleve argümanlar değere göre aktarılır ve değişkenler üzerinde yapılan herhangi bir değişiklik, aktarılan gerçek değişkenlerin değerini değiştirmez. Aşağıdaki örnek bu kavramı açıklamaya yardımcı olur: -

Örnek 5:

#include using namespace std;void test(int*, int*);int main() {int a = 5, b = 5;cout << "Before changing: << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;test(&a, &b);cout << "\nAfter changing" << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;}void test(int* n1, int* n2) {*n1 = 10;*n2 = 11;}

Çıktı:

İşte kodun bir ekran görüntüsü:

Kod Açıklaması:

  1. İki tamsayı parametresi alacak test adlı bir işlevin prototipini oluşturun.
  2. Main () işlevini çağırın. Program mantığını bünyesine ekleyeceğiz.
  3. Her biri 5 değerine sahip iki tam sayı değişkeni a ve b bildirin.
  4. Konsolda biraz metin yazdırın. Endl (bitiş çizgisi), sonraki satırda yazdırmaya başlamak için imleci hareket ettirecektir.
  5. Diğer metinle birlikte konsolda a değişkeninin değerini yazdırın. Endl (bitiş çizgisi), sonraki satırda yazdırmaya başlamak için imleci hareket ettirecektir.
  6. Diğer metinle birlikte konsolda b değişkeninin değerini yazdırın. Endl (bitiş çizgisi), sonraki satırda yazdırmaya başlamak için imleci hareket ettirecektir.
  7. Parametre olarak a ve b değişkeninin adreslerini alan test () adında bir işlev oluşturun.
  8. Konsolda biraz metin yazdırın. \ N, metin yazdırılmadan önce yeni bir boş satır oluşturacaktır. Endl (bitiş çizgisi), metin yazdırıldıktan sonra sonraki satırda yazdırmaya başlamak için imleci hareket ettirecektir.
  9. Diğer metinle birlikte konsolda a değişkeninin değerini yazdırın. Endl (bitiş çizgisi), sonraki satırda yazdırmaya başlamak için imleci hareket ettirecektir.
  10. Diğer metinle birlikte konsolda b değişkeninin değerini yazdırın. Endl (bitiş çizgisi), sonraki satırda yazdırmaya başlamak için imleci hareket ettirecektir.
  11. Program başarılı bir şekilde tamamlandığında değer döndürmelidir.
  12. Main () işlevinin gövdesinin sonu.
  13. Fonksiyon testinin tanımlanması (). İşlev, iki tamsayı işaretçi değişkeni * n1 ve * n2 almalıdır.
  14. * N1 gösterici değişkenine 10 değeri atama.
  15. * N2 gösterici değişkenine 11 değeri atama.
  16. Fonksiyon testinin gövdesinin sonu ().

Hatta, fonksiyon testinde a ve b değişkenine yeni değerler atanmasına rağmen, fonksiyon çağrısı tamamlandığında, aynısı ana fonksiyona yansıtılmaz.

İşaretçileri işlev bağımsız değişkenleri olarak kullanmak, değişkenin gerçek adresini işlevde geçirmeye yardımcı olur ve değişken üzerinde gerçekleştirilen tüm değişiklikler dış işlevde yansıtılır.

Yukarıdaki durumda, 'test' fonksiyonu 'a' ve 'b' değişkenlerinin adresine sahiptir. Bu iki değişkene 'test' fonksiyonundan doğrudan erişilebilir ve bu nedenle bu değişkenlerde yapılan herhangi bir değişiklik 'ana' çağıran fonksiyonunda yansıtılır.

İşaretçiler kullanmanın avantajları

Burada, İşaretçiler kullanmanın artıları / avantajları var

  • İşaretçiler, diğer değişkenlerin adresini C ++ 'da saklayan değişkenlerdir.
  • İşlev tarafından işaretçiler kullanılarak birden fazla değişken değiştirilebilir ve döndürülebilir.
  • Bellek, işaretçiler kullanılarak dinamik olarak tahsis edilebilir ve ayrılabilir.
  • İşaretçiler, programın karmaşıklığını basitleştirmeye yardımcı olur.
  • Bir programın yürütme hızı işaretçiler kullanılarak artar.

Özet:

  • Bir işaretçi, başka bir değişkenin değişken tutan adresini ifade eder.
  • Her işaretçinin geçerli bir veri türü vardır.
  • Bir işaretçi, bir hafıza adresinin sembolik bir temsilidir.
  • İşaretçiler, programların çağrıya göre çağrı simülasyonu yapmasına ve dinamik veri yapıları oluşturup işlemesine izin verir.
  • Diziler ve işaretçiler ilgili bir kavramı kullanır.
  • Dizi adı, dizinin tabanını belirtir.
  • Bir dizinin adresini bir işaretçiye atamak istiyorsanız, bir ve işareti (&) kullanmayın.
  • Bir işaretçi değişkeni atamak için belirli bir adres yoksa, ona bir NULL atayın.