Fonksiyonlar #4 – C Programlama Dili

C programlama dili derslerinin bu bölümünde fonksiyonlara dizi ve pointer aktarımının nasıl olduğunu ve fonksiyonlarda dizi ve pointer kullanımını göreceğiz.
Bu derse geçmeden önce fonksiyonlarda referans ve değer yoluyla parametre aktarma konusunu anladığınızdan emin olun.
Fonksiyonlar ve Diziler
Dizi kavramı normal değişken kavramından biraz farklıdır. Dizileri, çoklu değişkenleri tek bir yapı içerisinde tutan tümleşik bir yapı olarak söylemiş olsak da değişkenlerden uygulamada farkları vardır.
Mesela fonksiyonlara dizileri parametre olarak aktarmak istediğimizde “dizinin ilk elemanının bellek adresini” yani dizinin başlangıç adresini parametre olarak aktarırız.
Örneğin herhangi bir diziyi parametre olarak alan fonksiyon bildirimi aşağıdaki gibi yapılır :
- void function ( int iarray[7]); //1.bildirim
- void function (int iarray[]); //2.bildirim
- void function (int *ipointer); //3.bildirim
Şimdi bu bildirimlerin ne anlama geldiği üzerine konuşalım. 1.bildirimde fonksiyonun parametre olarak alacağı dizinin türü ve eleman sayısı bildirilmiştir. Yani 1.bildirimdeki fonksiyon tanımlamasında alabileceği dizinin int türünde ve 7 elemanlı olması gerekir.
2.bildirimde ise fonksiyon int türünde olan herhangi bir boyuttaki diziyi alabileceğini belirtmektedir. Yani 2.bildirimde dizi parametresi boyutsuz olarak tanımlanmıştır.
3.bildirimde ise dizi ile aynı türde bir pointer kullanarak fonksiyon tanımlaması yapılmıştır.
Şimdi 1.bildirime ait bir örnek uygulama yapalım ki, kullanımını daha iyi anlayabilelim. Uygulamamız aşağıdaki gibidir :
Uygulamanın ilk başında
void diziDegistir(int iArray[5]);
şeklinde bir fonksiyon bildirimi ile karşılaşıyoruz. Bu bildirim bize diziDegistir() adında bir fonksiyonun olduğunu ve int tipinde 5 elemanlı bir diziyi parametre olarak aldığını ifade ediyor.
Sonrasında main() fonksiyonumuza giriyoruz. Fonksiyonun hemen başındaki
int iDizi[5] = {0,1,2,3,4};
ifadesi ile iDizi[] adında 5 elemanlı bir dizi tanımlayıp ilk değerlerini veriyoruz. Sonrasında
diziDegistir(iDizi); // Dizinin adresi, dizinin ismidir.
İfadesi ile diziDegistir() fonksiyonuna iDizi[] dizisinin adresi verilmiştir. Uygulama bundan sonra diziDegistir() fonksiyonuna gidecektir.
diziDegistir() fonksiyonunun başında ekrana
“DİZİ ELEMANLARI”
Yazısı yazdırıldıktan sonra bir for döngüsüne girilmektedir. For döngüsü içerisinde iArray[] dizisinin elemanları ekrana yazdırıldıktan sonra değerlerine +3 değeri eklenecektir.
iArray[5] parametresi diziDegistir() fonksiyonuna ait bir dizi olsa da main() fonksiyonundaki iDizi[5] dizisinin adresini aldığı için aslında iDizi[5] nin kendisi olmuştur. Yani burada yapılan her değişiklik direk main() fonksiyonundaki iDizi[] değerlerini de etkileyecektir.
Fark ettiniz mi bilmiyorum diziDegistir() fonksiyonunun herhangi bir geri dönüş değeri bulunmamaktadır. Aslında geri dönüş değerine de ihtiyacı yoktur. Referans yoluyla parametre aldığı için fonksiyon içerisinde yapılan her değişiklik zaten ana programda da etkili olacaktır. Yani bir değer döndürmesine gerek yoktur.
Şimdi main() fonksiyonuna dönelim. Bir printf() fonksiyonu ile ekrana
“FONKSİYONUN DEĞİŞTİRDİĞİ DİZİ ELEMANLARI”
Yazısı yazacaktır. Sonrasında gelen for döngüsü ile tekrar iDizi[] dizisinin elemanları ekrana yazdırıldığında görüyoruz ki, fonksiyonda yapılan değişiklikler aynen iDizi[] dizisini de etkilemiştir.
Çıktımız aşağıdaki gibidir :
Şimdi de 2.fonksiyon bildirimine örnek olacak şekilde bir önceki uygulamamızı modifiye edelim. Bu uygulamada boyutsuz dizi parametresine sahip bir fonksiyon ile karşılaşacağız.
Uygulamayı bildiğimiz için baştan anlatmak yerine sadece değişen kısımlar üzerinde duracağım. İlk olarak gözümüze çarpan fonksiyon bildirimi oluyor :
void diziDegistir(int iArray[]); //dizi boyutu yok
Fonksiyon bildiriminde görüldüğü gibi parametre olarak alınan dizi için bir boyut sınırı konulmamış. Yani bu fonksiyon her boyuttaki diziye hizmet edebilir anlamına geliyor.
Sonrasında
int elemanSayisi;
gibi bir tanımlama dikkat çekiyor. Ben bu değişkeni dizi eleman sayısını belirlemek için oluşturdum. Böylelikle dizi, fonksiyona gittiğinde bu elemanSayisi bilgisine göre işlem yapabilecek. elemanSayisi değişkenini global tanımlamamın sebebini anlamışsınızdır herhalde: her yerden erişebilmek.
elemanSayisi değişkeninin değeri ise main() fonksiyonunda
elemanSayisi = sizeof(iDizi)/sizeof(int);
ifadesi ile belirleniyor. sizeof() operatörü ile iDizi dizisinin boyutunu alıp int boyutuna böldüm ve değeri elemanSayisi değişkenine atmış olduk.
Fonksiyonu çağırma konusunda
diziDegistir(iDizi); // Dizinin adresi, dizinin ismidir.
Herhangi bir değişiklik gözükmüyor. Dizinin adresini yani ismini fonksiyona vermemiz yeterli.
diziDegistir() fonksiyonuna gelelim. Parametresinde, bildiriminde olduğu gibi boyutsuz int tipinde bir dizi gözüküyor. Boyutu olmadığı için de fonksiyonun içindeki for döngüsünde elemanSayisi değişkenini sınır olarak belirledik. Geriye kalan kısım ise aynısı.
Çıktımız ise aşağıdaki gibidir :
Şimdi de 3.fonksiyon bildiriminde olduğu gibi pointer kullanalım. Gene aynı örnek üzerinden gideceğiz ki farkı görebilelim.
Uygulamamız gene aynı uygulama olduğundan sadece değişen kısımlar üzerinde konuşalım. Şimdiye kadar diziDegistir() fonksiyonu parametre olarak normal dizi ve boyutsuz dizi almıştı. Şimdi ise bir pointer alacak. Biz daha önceki Pointer dersinde “Pointerların aslında doğal diziler olduğunu” söylemiştik. Bir dizi ile yapabileceğiniz her şeyi bir pointer ile de yapabilirsiniz.
Nitekim bunu uygulama üzerinde de görüyoruz. Uygulamanın baş kısmında
void diziDegistir(int *iPointer); //parametremiz pointer
ifadesi ile fonksiyon bildirimi yapılmıştır. Bildirimi yapılan fonksiyonun parametresi bir pointerdır. Sonrasında main() fonksiyonuna gelelim. iDizi[] dizisini fonksiyona parametre olarak vermek için diğer iki yolda olduğu gibi sadece dizinin ismini yani adresini veriyoruz.
diziDegistir(iDizi); // Dizinin adresi, dizinin ismidir.
Gelelim diziDegistir() fonksiyonuna. Fonksiyondaki for döngüsünde bir pointer kullanarak dizi elemanlarına nasıl erişebileceğimizi görüyoruz.
printf("\t%d\t", *(iPointer + i));
Sonrasında bir pointerı da aslında bir dizi gibi nasıl kullanacağımızı görüyoruz :
iPointer[i] = iPointer[i] + 3;
Uygulamanın kalan kısımları ise diğer 2 programla aynı olduğu için anlatmaya lüzum görmüyorum.
Bugünlük bu kadar, umarım faydalı bir çalışma olmuştur.
Uygulama noktasında herhangi bir sorun yaşarsanız aşağıdaki yorum panelini kullanarak iletişime geçmekten çekinmeyin lütfen. Teşekkürler.
Kaynak belirtilmeyen görseller @etasarim a aittir. / Pictures that don’t have any source belongs to @etasarim.
Posted from my blog with SteemPress : http://etasarim.cloudaccess.host/02/04/2019/fonksiyonlar-4-c-programlama-dili/
Hi, @etasarim!
You just got a 1.86% upvote from SteemPlus!
To get higher upvotes, earn more SteemPlus Points (SPP). On your Steemit wallet, check your SPP balance and click on "How to earn SPP?" to find out all the ways to earn.
If you're not using SteemPlus yet, please check our last posts in here to see the many ways in which SteemPlus can improve your Steem experience on Steemit and Busy.
Herşeyin organiği mahbuldür, pointer da bu anlamda organik gibi duruyor o zaman o da makbuldür diyerek, bir dersinin altına daha sululuk yapmaya geldim :)
Ellerine sağlık, yılmadan derslere tam gaz devam etmen takdirlik.
Vaay canım hocam ya çok güzel bir tespit :) Teşekkür ederim sempatik yorumunuz için. Sizi burada görmek güzel gerçekten. Yoruldum ama inşallah böyle devam edebilirim.
You got a 16.14% upvote from @minnowvotes courtesy of @etasarim!
Congratulations! This post has been upvoted from the communal account, @minnowsupport, by etasarim from the Minnow Support Project. It's a witness project run by aggroed, ausbitbank, teamsteem, someguy123, neoxian, followbtcnews, and netuoso. The goal is to help Steemit grow by supporting Minnows. Please find us at the Peace, Abundance, and Liberty Network (PALnet) Discord Channel. It's a completely public and open space to all members of the Steemit community who voluntarily choose to be there.
If you would like to delegate to the Minnow Support Project you can do so by clicking on the following links: 50SP, 100SP, 250SP, 500SP, 1000SP, 5000SP.
Be sure to leave at least 50SP undelegated on your account.