Diziyi fonksiyona geçme
- C kursu
- Başlangıç
- Ders 79/116
- 5 dk
Diziyi fonksiyona işaretçi olarak geçmeyi öğrenirsin.
Diziyi fonksiyona geçirme
Bir diziyi fonksiyona geçirirken dizi adı işaretçiye dönüşür. Fonksiyon imzasında int arr[] veya int *arr yazabilirsin; ikisi de aynı anlama gelir.
int sum(int arr[], int n) {
int total = 0;
for (int i = 0; i < n; i++) total += arr[i];
return total;
}Dizi uzunluğu işaretçi ile gelmez; bu yüzden n parametresi ayrı verilir. Fonksiyon dizinin orijinal elemanlarını görür, kopyasını değil.
sizeof işaretçide küçük gelir
Fonksiyon içinde sizeof(arr) dizi boyutunu değil, işaretçi boyutunu verir (genellikle 4 veya 8 byte). Bu yüzden dizi uzunluğunu fonksiyona ayrı parametre olarak vermek zorunludur.
void print_all(int *arr, int n) {
/* sizeof(arr) burada 4 veya 8! */
for (int i = 0; i < n; i++) printf("%d ", arr[i]);
}Bu, dizi çürümesinin en sıkı tuzağıdır. Uzunluğu her zaman ayrı taşı.
Uygulama Toplam fonksiyonu yaz
int sum(int *arr, int n) fonksiyonunu tanımla: bir for döngüsü ile dizinin elemanlarını topla ve total değişkenini döndür. main içinde int arr[3] = {4, 5, 6}; tanımla ve printf("%d\n", sum(arr, 3)); ile sonucu yazdır. Çıktı 15 olmalı.
Başlangıç kodu
#include <stdio.h>
/* sum fonksiyonunu buraya tanımla: int dizisinin toplamını döndür */
int main(void) {
int arr[3] = {4, 5, 6};
/* sum çağrısı ile toplamı yazdır */
return 0;
}Örnek çözüm
#include <stdio.h>
int sum(int *arr, int n) {
int total = 0;
for (int i = 0; i < n; i++) {
total += arr[i];
}
return total;
}
int main(void) {
int arr[3] = {4, 5, 6};
printf("%d\n", sum(arr, 3));
return 0;
}Beklenen çıktı
15
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 İmza ve anlam eşleştir
| Kavram | Anlamı |
|---|---|
int arr[] |
dizi parametresi |
int *arr |
işaretçi parametresi |
arr, 3 |
dizi ve boyut |
sum(arr, n) |
fonksiyon çağrısı |
2 Hangi fonksiyon imzası bir int dizisini kabul eder?
- void f(int[] arr)
- void f(int arr)
- void f(int *arr[])
- void f(int arr[]) Doğru cevap
Açıklama: int arr[] imzası bir int dizisini (işaretçi) kabul eder.
3 Fonksiyona dizi ve boyut geçir
int arr[3] = {1, 2, 3};
sum(arr, ____); /* 3 elemanlı diziyi geçir */
int arr[3] = {1, 2, 3};
sum(arr, 3); /* 3 elemanlı diziyi geçir */
Açıklama: 3 elemanlı dizi için boyut 3 verilmeli.