Neler yeni
Türkiye'nin En Güncel Forum Sitesi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı yada giriş yapmalısınız. Forum üye olmak tamamen ücretsizdir.

C++ Pointers(Göstericiler) - 4 -

ByOnur58

Kayıtlı Üye
MFC Üyesi
  • Üyelik Tarihi
    7 Ocak 2015
  • Mesajlar
    2,113
  • MFC Puanı
    10
  • MFC Seviyesi

C++ Pointers(Göstericiler) - 4 -

şimdide sizlere bazı yararlı fonksiyon vs. anlatacağım
ondan önce "Dinamik Bellek Kullanımı" nı pekiştirmek için bir örnek yapalım:

- Kullanıcıdan kaç tane sayı gireceğini sorsun
- kullanıcıdan aldığı sayı kadar heap bellekten yer oluştursun
- sonra kullanıcıdan oluşturulan alanlra parametre girmesi istensin
- kullanıcı parametreleri girdikten sonra girdiği parametreleri sırasıyla ekrana yazdırsın:


Kod:
#include <iostream>

using namespace std;

int main()
{
	int* po;
	int kac = 0;

	cout << "Kac Sayi Girlecek..: " << endl;
	cin >> kac;

	// "kac" değişkeninin içindeki değer kadar heap hafızadan alan
	// tahsis edilip başlangıç adresi "po" işaretçisine eşitleniyor
	po = new int[kac];

	// sonra kullanıcıdan tahsis edilen alanlara sayı girmesi isteniyor
	for(int i = 0; i < kac; i++)
	{
		cout << i << ".Sayi..: ";
		cin >> po[i];
	}

	cout << endl;

	// sonra ekranda kullanıcının girdiği değerler sırasıyla yazdırılıyor
	for(int i = 0;i < kac;i++)
		cout << "po[" << i << "]..: " << po[i] << endl;

	cout << endl;

	// işler bittikten sonra delete[] ile dizi alanı serbest bırakıyoruz
	delete[] po;

	system("PAUSE");
	return 0;
}


şimdi konumuza geçelim:

=> biz heap bellekten alan alıyoruz iyi güzelde ya yeterli alan yoksa veya uygun alan yoksa nolacak tabiki programımız patlıyacak bu patlamanın önüne geçmek için new kütüphanesini oluşturan "Free Software" vakfı bunu düşünerek bir hata kontrol mekanizması oluşturmuş yani bunu kullanarak programınızın patlamasını önleyeceğiz sadece istediğimiz hata mesajını ekranda göstereceğiz :

gelin kod ile açıklayalım:
Kod:

Kod:
int main()
{
	int* po;
	int boyut;

	cout << "Nekadar Alan Istersin..: ";
	cin >> boyut;

	po = new(nothrow) int[boyut];

	if(po == 0)
		cout << "HATA..: bellek tahsis edilemedi" << endl;
	else
	{
		cout << "Bellek Basariyla Tahsis Edildi" << endl;
		delete[] po;
	}

	system("PAUSE");
	return 0;
}


Kod:
yukarda dikktimizi çeken farklı birşey nothrow bu işemi yapacak olan bu eğer yeterli veya uygun alan yoksa NULL döndürür yani bu durumda po = 0x0000000 olur

Not: Hatayı görebilmek için(32 bit 4 GB Ram'de denemiştir) "536870911" değerini giriniz  eğer "536870912" girerseniz derleyici Run-Time hata verir(eski derleyicilerde hatayı alamayabilirsiniz).

sizeof() 
verilen değişkenin yapının, sınıfın vs. kaç byte olduğunu döndürür örnek:

Kod:
	int dene = 56;
	int boyut = sizeof(dene);
yukarda dene değişkeni int türü odluğundan 4 byte'dir. boyut değişkenine sizeof(dene); 'yi eşitlemişiz sizeof dene değişkeninin hafızada kaç byte yer kapladığını döndürür yani dene int türünden olduğu için 4 byte dir sizeof'ta 4 döndürecektir ve boyut değişkeni 4 olacaktır.
birde diziler için bakalım (diziler alt yapıda aslında bir göstericidir):

Kod:
	int dene[5];
	int toplamBoyut = sizeof(dene);
	int turBoyutu = sizeof(*dene);
yukarda "toplamBoyut" değişkenine 20 atanır çünkü dene dediğimizde dene'nin gösterdiği adresteki verilerin toplam boyutu döner.
"turBoyut" değişkenine ise 4 atanır çünkü dene int türündendir.

memcpy()
kısacası değişken, dizi vs. kopyalamaya yarar.

Not: bu şekilde bir işiniz çıkarsa yani kopyalama gereksinimi duyarsanız direk bu fonksiyonu kullanın emin olun ki sizin yapacağınız döngüden kat kat daha hızlıdır sonuçta bu işi bilen profesyonel adamlar tarafından yapılıyor:

kullanımı:
Kod:
memcpy(yapıştırılacak_alan, kopyalanacak_alan, kaç_byte'ı_kopyalanacak);
bir örnekle daha iyi anlayalım:
Kod:
int main()
{
	char dene[50] = "deneme yazisi";
	char yeni[50];

	memcpy(yeni, dene, sizeof(*dene));

	cout << "dene..: " <<  dene << endl;
	cout << "yeni..: " << yeni << endl;

	system("PAUSE");
	return 0;
}
Çıktısı:
Kod:
dene..: deneme yazisi
yeni..: deneme yazisi
gördüğümüz gibi dene'nin gösterdiği yerdeki verileri yeni'ye kopyalamış.
yani memcpy fonksiyonuna dedik ki "yapıştırılacak alan: yeni, kopyalanacak olan: dene, 50 byte(sizeof(dene))'ı kopyalanacak."
 
Üst Alt