Algoritma ve Programlama 4. Hafta Örnekler


Dinamik Bellek Ayırma, İşaretçi Fonksiyon Geçirme ve Parametrelerin İşaretçi ile Geçilmesi

Dinamik Bellek Ayırma

Örnek 1: malloc() ve free()
// Kullanıcı tarafından girilen n sayının toplamını hesaplayan program

#include <stdio.h>
#include <stdlib.h>

int main() {
  int n, i, *ptr, sum = 0;

  printf("Eleman sayısını girin: ");
  scanf("%d", &n);

  ptr = (int*) malloc(n * sizeof(int));
 
  // Bellek tahsis edilemezse
  if(ptr == NULL) {
    printf("Hata! Bellek tahsis edilemedi.");
    exit(0);
  }

  printf("Elemanları girin: ");
  for(i = 0; i < n; ++i) {
    scanf("%d", ptr + i);
    sum += *(ptr + i);
  }

  printf("Toplam = %d", sum);
  
  // Belleği serbest bırakma
  free(ptr);

  return 0;
}
            
Çıktı:
Eleman sayısını girin: 3
Elemanları girin: 100
20
36
Toplam = 156

Örnek 2: calloc() ve free()
// Kullanıcı tarafından girilen n sayının toplamını hesaplayan program

#include <stdio.h>
#include <stdlib.h>

int main() {
  int n, i, *ptr, sum = 0;
  printf("Eleman sayısını girin: ");
  scanf("%d", &n);

  ptr = (int*) calloc(n, sizeof(int));
  if(ptr == NULL) {
    printf("Hata! Bellek tahsis edilemedi.");
    exit(0);
  }

  printf("Elemanları girin: ");
  for(i = 0; i < n; ++i) {
    scanf("%d", ptr + i);
    sum += *(ptr + i);
  }

  printf("Toplam = %d", sum);
  free(ptr);
  return 0;
}
            
Çıktı:
Eleman sayısını girin: 3
Elemanları girin: 100
20
36
Toplam = 156

Örnek 3: realloc()
/* Dinamik olarak tahsis edilmiş bellek yetersizse veya fazlaysa, realloc() ile boyutu değiştirin. Syntax: ptr = realloc(ptr, x); */

#include <stdio.h>
#include <stdlib.h>

int main() {
  int *ptr, i, n1, n2;
  printf("Boyutu girin: ");
  scanf("%d", &n1);

  ptr = (int*) malloc(n1 * sizeof(int));

  printf("Önceden tahsis edilen belleğin adresleri:\n");
  for(i = 0; i < n1; ++i)
    printf("%pc\n", ptr + i);

  printf("\nYeni boyutu girin: ");
  scanf("%d", &n2);

  // Belleği yeniden tahsis etme
  ptr = realloc(ptr, n2 * sizeof(int));

  printf("Yeni tahsis edilen belleğin adresleri:\n");
  for(i = 0; i < n2; ++i)
    printf("%pc\n", ptr + i);
  
  free(ptr);

  return 0;
}
            
Çıktı:
Boyutu girin: 2
Önceden tahsis edilen belleğin adresleri:
26855472
26855476

Yeni boyutu girin: 4
Yeni tahsis edilen belleğin adresleri:
26855472
26855476
26855480
26855484

İşaretçilerin Fonksiyonlara Geçirilmesi

Örnek: Adresleri Fonksiyonlara Geçirme
#include <stdio.h>
void swap(int *n1, int *n2);

int main()
{
    int num1 = 5, num2 = 10;

    // num1 ve num2'nin adresleri swap() fonksiyonuna gönderilir
    swap(&num1, &num2);

    printf("num1 = %d\n", num1);
    printf("num2 = %d", num2);
    return 0;
}

void swap(int* n1, int* n2)
{
    int temp;
    temp = *n1;
    *n1 = *n2;
    *n2 = temp;
}
            
Çıktı:
num1 = 10
num2 = 5

Bu örnekte, swap(&num1, &num2); ifadesiyle num1 ve num2'nin adresleri fonksiyona gönderilir. Fonksiyonda *n1 ve *n2 değiştirilince, main() içerisindeki değişkenler de değişir.


Örnek 2: Fonksiyonlara İşaretçi Geçirme
#include <stdio.h>

void addOne(int* ptr) {
  (*ptr)++; // *ptr değerine 1 eklenir
}

int main()
{
  int* p, i = 10;
  p = &i;
  addOne(p);

  printf("%d", *p); // 11
  return 0;
}
            
Çıktı:
11

Bu örnekte, p işaretçisi &i adresini tutar ve addOne(p) çağrısı ile fonksiyona gönderilir. Fonksiyonda, (*ptr)++; ifadesiyle i değeri 1 artırılır.


Parametrelerin İşaretçi ile Geçilmesi

Örnek 1: İşaretçi ile Değer Geçirme
// Aşağıdaki program, bir değişkenin değerini işaretçi kullanarak fonksiyondan değiştirmeyi göstermektedir.

#include <stdio.h>

// Fonksiyon, parametre olarak gönderilen işaretçi ile değişkenin değerini 5 artırır.
void modifyVal(int* myptr)
{
    // myptr'nin işaret ettiği değeri değiştiriyoruz
    *myptr = *myptr + 5;
}

int main()
{
    int x = 5;
    int* myptr = &x;

    // İşaretçi myptr fonksiyona gönderilir
    modifyVal(myptr);

    // x'in değeri değiştirilmiş olarak yazdırılır
    printf("x'in değiştirilmiş değeri: %d\n", x);
    return 0;
}
            
Çıktı:
x'in değiştirilmiş değeri: 10

Bu örnekte, modifyVal() fonksiyonu myptr aracılığıyla x değerini değiştirir.


Örnek 2: Sayının Karesini Hesaplama
// Aşağıdaki program, bir sayının karesini hesaplamak için işaretçi kullanarak parametre geçirme örneğidir.

#include <stdio.h>

void square(int *n)
{
    *n = (*n) * (*n);
}

int main()
{
    int num = 4;
    square(&num);
    printf("Karesi: %d\n", num); // Çıktı: 16
    return 0;
}
            
Çıktı:
Karesi: 16

Örnek 3: Dizinin Elemanlarını İkiye Katlama
// Bu örnekte, bir dizinin tüm elemanları işaretçi kullanılarak fonksiyona gönderilip ikiyle çarpılmaktadır.

#include <stdio.h>

void doubleElements(int *arr, int size)
{
    for (int i = 0; i < size; i++) {
        *(arr + i) *= 2;
    }
}

int main()
{
    int arr[] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    doubleElements(arr, size);
    
    printf("İkiye katlanmış dizi: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}
            
Çıktı:
İkiye katlanmış dizi: 2 4 6 8 10
Kaynak