Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Sı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:

  1. Parametre olarak bir tam sayı dizisi ve dizinin boyutunu alan analyzeTemperatures adında bir fonksiyon oluşturun
  2. analyzeTemperatures fonksiyonu içinde, ortalama sıcaklığı hesaplayın ve tam olarak 1 ondalık basamakla şu formatta yazdırın: Average temperature: [value]
  3. analyzeTemperatures fonksiyonu içinde, en yüksek sıcaklığı bulun ve şu formatta yazdırın: Highest temperature: [value]
  4. analyzeTemperatures fonksiyonu içinde, 25 derecenin üzerindeki sıcaklıkların sayısını bulun ve şu formatta yazdırın: Days above 25 degrees: [count]
  5. main fonksiyonunda, sıcaklık ölçümlerinin sayısını temsil eden bir n tam sayısı okuyun
  6. n adet sıcaklık değerini okuyun ve bunları bir tam sayı dizisinde saklayın
  7. Diziyi ve boyutunu argüman olarak göndererek analyzeTemperatures fonksiyonunu ç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: 3

Bu 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;
}
quiz iconKendini test et

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