12.01.2025
1
Like
40
Views
Bilgisayar mühendisliği, yazılım mühendisliği gibi bölümlerde okuyan 1. sınıf öğrencileri için C dilinde öğrenilen pointer ve struct yapıları, özellikle güz dönemi derslerinde ve final sınavlarında karşınıza çıkabilecek önemli konulardır. Bu yazıda, pointer ve struct yapılarının temellerini ve nasıl kullanılacaklarını açıklayarak, C dilindeki bu kritik konularda yardımcı olmayı amaçlıyorum.
Pointer Nedir?
Pointerlar, C dilinde oldukça önemli ve kullanışlı bir konudur. Kısacası, pointerlar bir veri değişkeninin bellekteki adresini tutan göstericilerdir. Yani, bir değişkenin değerini değil, o değişkenin bellek adresini saklarlar.
Pointerlar, *
sembolüyle tanımlanır. Bir pointer'ı kullanmadan önce, genellikle NULL değeri atanarak, güvenli bir şekilde başlatılır. Ayrıca, pointer'ların tipi, adresini saklayacağı değişkenin veri tipiyle uyumlu olmalıdır.
Örnek olarak:
c
Kodu kopyalaint *ptr = NULL; // veya int *ptr = 0;
Burada ptr
adında bir integer pointer'ı tanımladık ve başlangıçta NULL değeri atadık. Bu pointer, ilerleyen zamanlarda bir integer değişkeninin adresini saklayacak.
Pointer'ı kullanabilmek için bir değişkenin adresini saklamamız gerekiyor. Bunu yaparken, değişkenin adresini almak için &
sembolünü kullanıyoruz. Mesela:
c
Kodu kopyalaint jesus = 67;
ptr = &jesus; // ptr, jesus değişkeninin adresini tutuyor
Pointer ve adres değerlerini yazdırmanın birkaç yolu var. Birincisi, pointer'ın sakladığı adresi görmek:
c
Kodu kopyalaprintf("ptr pointerinin adresi: %p\n", ptr);
printf("jesus değişkeninin adresi: %p\n", &jesus);
Burada %p
formatı, pointer'ın tuttuğu adresi yazdırmamızı sağlar.
İkinci seçenek ise, pointer'ın gösterdiği değeri almak. Yani, pointer'ı dereference ederek, o adresin içeriğini yazdırmak için *
sembolünü kullanıyoruz:
c
Kodu kopyalaprintf("ptr pointerinin değeri: %d\n", *ptr);
printf("jesus değişkeninin değeri: %d\n", jesus);
Burada *ptr
, ptr
pointer'ının işaret ettiği adresin içindeki değeri verir.
C dilinde diziler zaten bellek adreslerini tutar. Yani, bir dizi tanımladığınızda, dizinin adı aslında dizinin ilk elemanının adresini gösterir. Bu yüzden pointerlar ve diziler çok sık birlikte kullanılır.
Örnek:
c
Kodu kopyalachar dizi[] = {'a', 'b', 'c', 'd', 'v', 'f'};
char *dizipointi = dizi; // dizi zaten bir pointer'dır
Bu şekilde diziyi pointer ile eşleştirdik. Eğer dizinin elemanlarını yazdırmak istersek:
c
Kodu kopyalafor (int i = 0; i < 6; ++i) {
printf("%c\n", *(dizipointi + i));
}
Bu kodda dizipointi + i
, pointer'ı birer birer ilerletir ve her bir dizinin elemanını sırayla yazdırır.
Struct yapısı, birden fazla farklı veri tipini tek bir yapı altında birleştirmemize olanak sağlar. Yani, farklı türdeki verileri gruplayarak, tek bir birim olarak işlem yapmamıza olanak tanır. C dilinde bir struct, genellikle daha büyük ve karmaşık veri yapıları oluşturmak için kullanılır.
Bir struct tanımlamak için önce struct
anahtar kelimesini kullanırız. Ardından, hangi verileri içereceğini belirleriz. Örnek bir struct tanımı:
c
Kodu kopyalastruct nunumi {
char mert;
char* name;
char* lastname;
int yas;
float scor;
};
Burada nunumi
adında bir struct oluşturduk ve içinde bir char
, iki char*
(string) ve bir int
ile float
türünde veriler tanımladık.
Struct'larda string (yazı) verileri tanımlamak için diziler veya pointerlar kullanılabilir. Dizilerle uğraşmak bazen zahmetli olabilir çünkü karakter sayısını önceden belirlemeniz gerekir ve bu, esneklik açısından sınırlayıcı olabilir. Pointer kullanmak ise, belleği daha verimli kullanmamıza ve daha esnek bir yapı oluşturabilmemize olanak tanır.
Artık struct'ı tanımladık ve bir değişken oluşturduk. Struct'ı kullanmak için o struct türünde bir değişken tanımlarız. Örneğin:
c
Kodu kopyalastruct nunumi isa;
Bu kodda, isa
adında bir nunumi
türünde değişken oluşturduk. Şimdi, isa
değişkenine değerler atayabiliriz. Bunun için iki yöntemimiz var.
c
Kodu kopyalaisa.mert = 'a';
isa.name = "Nurseli";
isa.lastname = "Demir";
isa.yas = 21;
isa.scor = 100;
c
Kodu kopyalastruct nunumi isa = {'a', "Nurseli", "Demir", 21, 100};
Struct verilerini yazdırmanın en kolay yolu, her bir öğe için printf
fonksiyonu kullanmaktır:
c
Kodu kopyalaprintf("Baş harf: %c\n", isa.mert);
printf("İsim: %s\n", isa.name);
printf("Soyisim: %s\n", isa.lastname);
printf("Yaş: %d\n", isa.yas);
printf("Skor: %f\n", isa.scor);
Struct içinde tanımlı olan verilere kullanıcıdan input almak için scanf
kullanabiliriz. Örneğin:
c
Kodu kopyalascanf("%d", &isa.yas);
Burada isa.yas
'a kullanıcıdan değer alıyoruz.
typedef
ile Struct Kullanımıtypedef
, bir türü başka bir isimle tanımlamamıza olanak tanır. Özellikle struct'larda, bu türler için daha kısa ve okunabilir isimler oluşturmak için kullanılır.
Örnek:
c
Kodu kopyalatypedef struct {
char *name;
int age;
} Person;
Burada Person
adında bir tür oluşturduk. Artık, Person
türünde değişkenler tanımlayabiliriz, ancak struct
anahtar kelimesini tekrar yazmamıza gerek kalmaz.
typedef
Kullanımının Avantajlarıtypedef
, struct türlerini kullanmayı daha pratik hale getirir. Kod yazarken struct
kelimesi yerine sadece türün ismini kullanabilirsiniz. Bu, kodu daha temiz ve anlaşılır yapar.
Örnek:
c
Kodu kopyalaPerson person1;
person1.name = "Ali";
person1.age = 25;
Burada, Person
türündeki person1
adında bir değişken oluşturduk ve değer atadık.
You need to log in to be able to comment!
İsa Ergişi
I am Isa. In 2023, I started the Computer Engineering program at Pamukkale University. I am currently a second-year student dedicated to Cybersecurity. I aim to fully develop my skills and specialize in this field. I perform my tasks using Kali Linux. I have a solid foundation in programming languages such as C, Python, ,Java and Ruby; I am proficient in using Windows, MacOS, and Linux operating systems.
Location
Ankara, TR
Education
Bilgisayar Mühendisliği - pamukkale üniversitesi