Fonksiyonlara Dizi Gönderme
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 29 / 63.
C'de bir diziyi bir fonksiyona geçirdiğinizde, arka planda ilginç bir şey olur. Dizinin kendisi aslında fonksiyona kopyalanmaz. Bunun yerine, geçirilen şey dizinin ilk elemanına bir işaretçidir (pointer).
Bu, int arr[] veya int *arr gibi bir fonksiyon parametresi yazdığınızda, her ikisinin de eşdeğer olduğu anlamına gelir; her ikisi de dizinin ilk elemanına bir işaretçiyi temsil eder. Fonksiyon, dizinin başladığı bellek adresini alarak orijinal dizinin verilerine doğrudan erişim sağlar.
void printArray(int arr[], int size) {
// arr aslında ilk elemana yönelik bir pointer'dır
// Fonksiyon orijinal diziye erişebilir ve onu değiştirebilir
}Fonksiyon, bir kopya yerine orijinal dizinin bellek konumuyla çalıştığı için, fonksiyon içinde yapılan her türlü değişiklik orijinal diziyi etkileyecektir. Bu, kopyalar oluşturan bağımsız değişkenlerin geçirilmesinden farklıdır.
Ayrıca, fonksiyonun dizinin uzunluğunu tek başına işaretçiden belirleyememesi nedeniyle, dizi boyutunu ayrı bir parametre olarak iletmeniz gerektiğini fark edeceksiniz.
Görev
KolaySıcaklık verilerini işleyen bir fonksiyon oluşturarak, dizilerin fonksiyonlara aktarılmasını gösteren bir C programı yazın. Programınız şunları yapmalıdır:
- Parametre olarak bir tam sayı dizisi ve dizinin boyutunu alan
analyzeTemperaturesadında bir fonksiyon oluşturun analyzeTemperaturesfonksiyonu içinde, ortalama sıcaklığı hesaplayın ve tam olarak 1 ondalık basamakla şu formatta yazdırın:Average temperature: [value]analyzeTemperaturesfonksiyonu içinde, en yüksek sıcaklığı bulun ve şu formatta yazdırın:Highest temperature: [value]analyzeTemperaturesfonksiyonu içinde, 25 derecenin üzerindeki sıcaklıkların sayısını bulun ve şu formatta yazdırın:Days above 25 degrees: [count]mainfonksiyonunda, sıcaklık ölçümlerinin sayısını temsil eden birntam sayısı okuyunnadet sıcaklık değerini okuyun ve bunları bir tam sayı dizisinde saklayın- Diziyi ve boyutunu argüman olarak göndererek
analyzeTemperaturesfonksiyonunu çağırın
Programınız sıcaklık verilerini işlemeli ve analiz sonuçlarını görüntülemelidir. Örneğin, giriş şu şekildeyse:
5
20 28 15 32 26Çıktınız şu şekilde olmalıdır:
Average temperature: 24.2
Highest temperature: 32
Days above 25 degrees: 3Bu zorluk, dizilerin fonksiyonlara ilk elemanlarına işaret eden işaretçiler (pointers) olarak nasıl aktarıldığını, fonksiyonun bir kopya oluşturmadan orijinal dizinin tüm elemanlarına erişmesine ve işlemesine nasıl olanak tanıdığını gösterir.
Kopya kağıdı
C'de dizileri fonksiyonlara aktarırken, dizinin kendisi kopyalanmaz. Bunun yerine, ilk elemana bir işaretçi (pointer) aktarılır.
Hem int arr[] hem de int *arr eşdeğer fonksiyon parametreleridir - ilk elemana bir işaretçiyi temsil ederler:
void printArray(int arr[], int size) {
// arr aslında ilk elemana bir işaretçidir
// Fonksiyon orijinal diziye erişebilir ve onu değiştirebilir
}Önemli noktalar:
- Fonksiyonlar, dizinin başladığı bellek adresini alır
- Fonksiyon içinde yapılan değişiklikler orijinal diziyi etkiler
- Fonksiyon sadece işaretçiden uzunluğu belirleyemediği için dizi boyutu ayrı bir parametre olarak aktarılmalıdır
Kendin dene
#include <stdio.h>
// YAPILACAK: analyzeTemperatures fonksiyonunu burada oluşturun
int main() {
// Sıcaklık ölçümü sayısını oku
int n;
scanf("%d", &n);
// Sıcaklıkları saklamak için dizi tanımla
int temperatures[n];
// Sıcaklık değerlerini oku
for (int i = 0; i < n; i++) {
scanf("%d", &temperatures[i]);
}
// YAPILACAK: analyzeTemperatures fonksiyonunu burada çağırın
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Logic & Flow bölümündeki tüm dersler
1Pointer Temelleri
Pointer Nedir?Pointer TanımlamaAdres Operatörü (&)Dereference Operatörü (*)NULL Pointer'larÖzet: Pointer Temelleri4Proje: Basit Metin Aracı
Projeye Genel BakışKarakter Sayma2İşaretçiler ve Diziler
İşaretçi Olarak Dizi İsimleriDizi Elemanları - İşaretçilerİşaretçi Aritmetiğiİşaretçilerin KarşılaştırılmasıÖzet: İşaretçi ile Dizi Gezinme5İşaretçiler ve Fonksiyonlar
Değer ile GeçmeFonksiyonlara İşaretçi Göndermeİşaretçiler ile Değişkenleri DeğiştirmeKlasik Bir Örnek: SwapFonksiyonlara Dizi GöndermeÖzet: Fonksiyon İşaretçi Argümanları8Yapılar ve İşaretçiler
Yapılara İşaretçilerOk Operatörü (->)Yapıları Değer ile AktarmaYapı İşaretçilerini AktarmaYapıların Dinamik TahsisiÖzet: Yapıyı Değiştirme - Ptr11Son Tekrar Görevleri
Tekrar: Dinamik String BirleştirmeTekrar: Struct DizisiTekrar: Kelime Frekans Sayacı3Karakter Dizileri ve Stringler
char Dizisi Olarak StringlerNull Sonlandırıcıscanf ile String Girişistrlen() Kullanımıstrcpy() Kullanımıstrcat() Kullanımıstrcmp() KullanımıÖzet: Temel String Fonksiyonları