C++’da Diziler ve İşaretçiler (Pointer ve Arrayler)
- April 20, 2013
Bu yazıda yine derste tuttuğum notlardan, C++ ile çalışırken dizi ve işaretçilerin nasıl kullanılacağı hakkında örnek üzerinden anlatım yapalım. Gerekli açıklamalar yorum satırları içerisinde yer almaktadır. Kodları yazının devamında bulabilirsiniz. İyi çalışmalar.
#include <iostream>
#include <string.h>
using namespace std;
struct Ogrenci
{
int num;
char isim[20];
};
int main(int argc, char const *argv[])
{
/* Pointer dediğin adres tutuyor işte. Ekstra bir şey yok. */
/* Struct'a olan pointerdan ortaya linked list çıkıyor. */
int t = 5; // Direct reference olarak geçiyor. Bu da aslında pointer.
/* Pointerlar indirect reference olarak geçiyor. Adresine referans ediyormuş. */
int *ptr; // adres tutacak bir pointer oluşturduk. Pointer 1 int boyunda.
ptr = &t // adresini aldık.
cout << "t değişkeni adresi: " << &t << endl;
cout << "Pointer'ın değeri(ptr): " << ptr << endl;
cout << "t değişkeninin değeri: " << t << endl;
cout << "Ptr'nin adresine gidilirse(*ptr): " << *ptr << endl;
cout << "Ptr'nin kendi adresi(&ptr): " << &ptr << endl;
cout << "ADRESLER EKSİK GÖZÜKEBİLİR ÇÜNKÜ BAŞLARINDA 00 VAR!!!" << endl;
/* ============================================================ */
cout << endl << endl;
/* C++'da dinamik bellek yönetimi' */
int *pnt; // Oluşturacağımız alanın adresini bu değişken tutacak.
pnt = new int; // 1 integer boyutunda alan oluşturduk.
*pnt = 10; // tuttuğu adresteki değeri 10 yaptık.
cout << pnt << " => " << *pnt << endl;
// Burdaki alan isimsizdir, sadece bu pointer ile erişilebilir.
int *dizi; // Dizi ayıracağız. integer tutacak.
dizi = new int [20]; // En sonda, aradaki boşluk önemli.
/* ============================================================ */
cout << endl << endl;
/* Yapıları gösteren işaretçiler */
// Yapı en yukarda Öğrenci olarak tanımlandı.
Ogrenci o1 = {40100447,"Güray"}; // Bir öğrenci yapısı.
cout << "o1.isim - " << o1.isim << endl;
Ogrenci* oPtr; // Öğrenci yapısına işaretçi.
oPtr = &o1 // Yapıyla işaretçi eşleşti.
strcpy(oPtr->isim, "Güray Yıldırım");
cout << "oPtr->isim - o1.isim son halleri: " << oPtr->isim << " - " << o1.isim << endl;
Ogrenci *o2; // Şimdi de aynısını dinamik bellek ayırarak yapalım.
o2 = new Ogrenci;
strcpy(o2->isim, o1.isim); // Stringleri strcpy ile kopyaladık.
o2->num = oPtr->num; // Numaraları direk eşleyerek kopyaladık.
cout << "o2 dinamikle oluşturulan isim: " << o2->isim << " - " << o2->num << endl;
int** pPtr; // İşaretçi tutacak işaretçi tanımlaması.
int* tutulacak; // Tutulacak işaretçi de bu olsun.
int x = 3; // Tutulacak işaretçisi bunu tutsun.
tutulacak = &x // İlk atama yapıldı.
pPtr = &tutulacak // İşaretçinin adresi pPtr'ye atandı.
cout << "Adresler sırayla: (pPtr, *pPtr, **pPtr)" << endl;
cout << pPtr << endl << *pPtr << endl << **pPtr << endl;
/* ============================================================ */
cout << endl << endl;
// Burda * a indirection operator deniyormuş.
// &* ile *& aynı şeylerdir.
// ptr++ ile ptr-- 4 er bayt kaydırma sağlar. Karakter pointerı
// ise 1 bayt kaydırır.
char isim[10] = "Guray";
char* isimTut = isim; // Dizi isimleri pointerdır, burda onu tuttuk.
isimTut += 3; // İlk karakterden 3 tane kaydıralım.
cout << isim << endl; // İsmin şu anki hali.
*isimTut = 'm'; // O an olduğu karakteri değiştir.
cout << isim << endl; // İsmin son hali.
/* Bir pointer a her değer atanabilir ama int e float atarsak farklı
değerlendirileceğinden saçma sapan sonuçlar alırız. */
/*
float b = 120.25; // Float b'nin adresini int tutan işaretçiye atayalım.
int* bPtr = &b // Derlenirken bir uyarı ya da hata alacağız.
cout << b << " - " << *bPtr << endl;
*/
/* ============================================================ */
cout << endl << endl;
/* Diziler */
// Ard arda dizilen aynı tür verileri içeren veri yapısı.
// Dizi isimleri sabit adres tutan işaretçilerdir.
// Dizi indislemeyle çalışan işlemler pointerla da yapılabilir ve
// daha hızlı çalışırlar.
return 0;
}
Sorularınızı burdan ya da bana ulaşabildiğiniz herhangi bir iletişim kanalından sorabilirsiniz.