Kayıtlar

işaretçi etiketine sahip yayınlar gösteriliyor

32 - Call By Reference ve Call By Value

Fonksiyonlara veri geçirilirken iki method kullanılır: referans ile çağırma methodu ve değer ile çağırma methodu. Bu methodlar ayrıca pass-by-reference ve pass-by-value olarak da isimlendirilirler. Call by value methodunda data fonksiyona geçirildiğinde geçirilen verinin bir kopyası oluşturulur. Çağrılan fonksiyon bu kopya ile çalışırken geri dönüşte çağıran fonksiyondaki asıl değişken, çağrılan fonksiyondaki yapılan işlemler nedeniyle oluşan değişikliklerden etkilenmez. Bu değişiklik sadece kopya üzerinde ve çağrılan fonksiyon içinde meydana gelir. #include <stdio.h> void call_by_value(int x) { printf("Fonksiyon icinde degisiklikten once x = %d \n", x); x += 10; printf("Fonksiyon icinde degisiklikten sonra x = %d \n", x); } int main() { int x = 10; printf("Fonksiyon cagrilmadan once ana fonksiyonda x = %d \n", x); call_by_value(x); printf("Fonksiyon cagrildiktan sonra ana fonksiyonda x = %d \n", x); return 0; } Öncelikl...

31 : Fonksiyonda Struct Kullanımı

Struct tipini fonksiyonlarda parametre ya da dönüş değeri olarak kullanabiliriz. Struct için fonksiyonda ekstra özel bir konu yok. Bir önceki yazıda kullandığımız özellikler ile fonksiyonlarda struct tipli değişkenleri kullanabiliriz. Bir fonksiyon ile mainde oluşturduğum bir ogrencinin bilgilerini dolduracağım. Daha sonra bir fonksiyon ile bu ogrencinin adını ve soyadını yazdıracağım. Başka bir fonksiyon ile de numarasını ve not ortalamasını yazdıracağım. Adını yazdırdığım fonksiyona parametre olarak structı verirken numarasını yazdırdığım fonksiyona parametre olarak structın adresini vereceğim. Bu iki kullanım arasında farklar var. Bu farkları başka bir yazıda açıklamaya çalışacağım. Bu yazıda sadece bu farkların sözdiziminde nasıl görüldüğünü göstereceğim. #include <stdio.h> #include <string.h> typedef struct ogrenci { char ad[50]; char soyad[50]; int numara; float not; }ogrenci; ogrenci bilgiDoldur(); void adSoyadYazdir(ogrenci bilgi); void notNumaraYa...

30 : Struct Tipinde Pointer

Bir struct değişkeni pointer olarak da tutulabilir. Bir önceki yazıda bir öğrenci bilgisi tutmayı görmüştük. Şimdi aynı kodda struct tipinde pointer kullanarak tekrar yazalım. #include <stdio.h> #include <string.h> typedef struct ogrenci { char ad[50]; char soyad[50]; int numara; float not; }ogrenci; int main() { ogrenci *ogrenci1 = malloc (sizeof(struct ogrenci)); ogrenci *ogrenci2 = malloc (sizeof(struct ogrenci)); if (ogrenci1 == NULL || ogrenci2 == NULL) { printf("Ogrenciler olusturulamadi \n"); return 0; } strcpy(ogrenci1->ad, "ad1"); strcpy(ogrenci1->soyad, "soyad1"); ogrenci1->numara = 55; ogrenci1->not = 3.5; strcpy(ogrenci2->ad, "ad2"); strcpy(ogrenci2->soyad, "soyad2"); ogrenci2->numara = 77; ogrenci2->not = 1.2; printf("Ogrenci 1 adi : %s \n", ogrenci1->ad); printf(...

28 : CPP Dilinde new Operatörü ile Dinamik Dizi Oluşturma

cpp dilinde dinamik bellek kullanımı c diline göre daha kolay. Bir önceki örnekte c dilinde malloc yada calloc kullanarak bir dizi oluşturup rastgele sayılar atamıştık. Bunu cpp dilinde yapmak istersek new operatörü kullanabiliriz. new operatörü sadece dizi değil struct, class gibi birimleri de yaratmada kullanılabilir. Bu tiplerle örnekler yaptığımızda new operatörünün nasıl kullanıldığını da inceleyeceğiz. Yine aynı şekilde bir dizi üretip rastgele sayılar atayıp bastıracağız. Sadece kaç adet sayı olacağını kullanıcıdan isteyeceğiz. dinamiknew.cpp #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i, num; int *data; time_t t; printf("Kac adet sayi olusturulsun: "); scanf("%d", &num); data = new int[num]; if(data == NULL) { printf("Hata!! Bellek yetersiz \n"); exit(0); } srand((unsigned) time(&t)); for(i = 0; i < num; ++i) { ...

27 : Dinamik Bellek Kullanımı

Daha önce diziler konusunda diziler kullanılırken bir sınır belirtmek gerektiğini söylemiştik. Örneğin kullanıcıdan sayı girmesi istenilecekse olabilecek bir maximum değer öngörülüp dizi tanımlanırken bu değer kullanılır. #define MAX 1024 int dizi[MAX]; Buna alternatif olarak belleği dinamik olarak da ayırıp kullanabiliriz. Program çalışırken bellekten belli bir bölüm ilgili iş için kullanılıp daha sonra boşaltılabilir. Burada dikkat edilmesi gereken kullanacağımız belleğin gerçekten ayrılmış olmasını kontrol etmek ve kullandıktan sonra gerekiyorsa ilgili alanı boşaltmak. Kontrol etmediğimiz takdirde belleğin ayrılamaması durumunda programın sonlanması; boşaltmamamız durumunda ise "memory leak" denilen belleğin tükenmesi sorunuyla karşılaşırız. Nasıl kullanıldığını görmek için bir örnekle kullanıcıdan bir miktar girmesini isteyip bu miktarda rastgele sayı oluşturup yazdıralım. dinamik.c #include <stdio.h> #include <stdlib.h> #include <time.h> int...

26 : Fonksiyonda Birden Fazla Değişkeni Güncellemek

Resim
Bir fonksiyonun birden fazla değişken dönüşü olamayacağını söylemiştik. Birden fazla değişken bir dizi halinde ise nasıl kullanacağımızı da gördük. Peki bu değişkenler birbirinden ayrı tiplerde değişkenler ise nasıl güncelleyebiliriz? Şimdi bir örnek uyduracağım. Diyeceğim ki bir fonksiyonum olsun. Rastgele boyutlu bir matris üretsin. Matrisin boyutları en çok 5x5 en az 1x1 olsun. Değerler 0 ile 1 arasında olsun ve rastgele seçilsin yine. Fonksiyonda bu değerler yazdırılsın ve sonra main fonksiyonda biz de tekrar yazdırıp doğru mu alıyoruz matrisi kontrol edebilelim. Önce matrisi oluşturacak bir fonksiyon yazmam gerekiyor. Rastgele sayılarla nasıl çalışılır görmüş de olacağız bu sayede. Ancak boyutun da rastgele olması bizim için problem. Çünkü main fonksiyonunda yazdırmak istediğimizde sınırları nasıl belirleyeceğimizi bilmemiz gerekir. Bunun için de bu boyut değerlerini fonksiyondan öğrenmemiz gerekir. rastgele_matris.c #include <stdio.h> #include <time.h> #include...

25 : Pointer ile Dizi Elemanlarına Ulaşma

Bir dizi, bellekte aynı tip verilerden oluşan bloğu ifade eder. Önceki örnekte bir işaretçinin bellekte verinin tutulduğu bir adresi ifade ettiğini söylemiştik. Aynı şekilde dizinin ismi de bu veri bloğunun başlangıç adresini ifade eder. Bir dizi değişkeni ile bir pointer değişkeni arasında benzerlikler bulunur. Aşağıdaki örnekte bir dizi tanımlayacağız ve bunu print ettireceğiz. Daha sonra tekrar pointer kullanarak ulaşıp print ettireceğiz ki fark olmadığını görelim. dizi_pointer.c #include <stdio.h> int main() { int data[7] = {12, 2, 4, 55, 132, 1567, 43}; int i = 0; printf("-- Girilen sayilar -- \n"); printf("Dizi ile: \n"); for(i = 0; i < 7; ++i) { printf("%d ", data[i]); } printf("\nPointer ile: \n"); for(i = 0; i < 7; ++i) { printf("%d ", *(data + i)); } printf("\n"); return 0; } Burada dikkat edilmesi gereken nokta *data ifadesinin data dizisinin i...

Pointer - 24 : İşaretçilerin(pointer) Durumu

İşaretçiler C-C++ dilinde belleğe ulaşmak, belleği kullanmak, yönetmek amaçlarıyla kullanılır. Bir pointer bir değişkenin bellekte tutulduğu yeri işaret eder. int var şeklinde bir değişken tanımladığımızda bu değişken bir değer tutarken int *var şeklinde bir değişken tanımladığımızda bu değişken bir adres tutmaktadır. int var; şeklinde tanımlanmış bir değişkenin adresi &var şeklinde ifade edilir. int *var; şeklinde tanımlanmış bir adresin tuttuğu değer ise *var şeklinde ifade edilir. pointers.c #include <stdio.h> int main(){ int* adres; int val; val = 22; printf("val in adresi : %p\n", &val); printf("val in degeri : %d\n\n", val); adres=&val; printf("adres pointerinin adresi : %p\n", adres); printf("adres pointerinin icerigi : %d\n\n", *adres); val = 11; printf("adres pointerinin adresi : %p\n", adres); printf("adres pointerinin icerigi : %d\n\n", *adres); *adres=...

Diziler - 19 : Bir pikselin renk kodları nasıl belirtilir.

Önceki örneklerde bir sürü değişken tanımladık, kullanıcıdan değerler atamasını istedik. Bunların hepsi tek bir sayıyla yada karakterle tanımlanmıştı. Bir resme baktığımızda üzerinde binlerce farklı renkli noktalar görürüz. Bu her bir nokta pixel ismiyle ifade edilir ve her birinin farklı uzaylarda farklı değerleri vardır. En çok bildiğimiz RGB uzayını düşünürsek bir pixelin değerini belirtmek için R(kırmızı), G(yeşil) ve B(mavi) olarak 3 ayrı değer belirtmemiz gerekir. Örneğin 8 bitlik RGB uzayında 3 ana renk şöyle tanımlanır: Kırmızı  : 255, 0 , 0 Yeşil      : 0, 255, 0 Mavi     : 0, 0, 255 Bu değerleri kullanırken her bir pixel için 3 ayrı değişken mi tutmamız gerekir. Bir resimde alt sol pixele p1 dersem ve kodumda kullanmak istersem; varsayalım değerini değiştirmek istiyorum: p1_r , p1_g ve p1_b olarak 3 ayrı değişken mi oluşturmam gerekir. Ya da bir fonksiyona parametre olarak geçireceğim. Şu şekilde mi yazarım: renk_degistir(p1_r, ...