C Programlama
- LValue: Adrese sahip, atama yapılabilen ifadelerdir.
- RValue: Atama yapılamayan, genellikle geçici değerlerdir.
- Call by Reference: C dilinde doğrudan yoktur, ancak pointerlar aracılığıyla benzer işlev sağlanabilir.
- Call by Value: Parametrelerin fonksiyona kopyalanarak gönderilmesidir.
- Postfix (i++): İşlemden sonra artırır.
- Prefix (++i): İşlemden önce artırır.
- Recursion: Bir fonksiyonun kendisini çağırma işlemidir.
- Redeclaration: Aynı kapsamda aynı isimle değişken ya da fonksiyon tekrar tanımlanamaz. Bu hata üretir.
,
operatörü aynı kapsamda aynı isimle değişken ya da fonksiyon tekrar tanımlanamaz. Bu hata üretir.
- argc: Argument count (argüman sayısı)
- argv: Argument vector (argüman dizisi)
- Diziler bellek adreslerini tutar.
- dizi[index] ile index[dizi] aynı anlama gelir (
*(dizi + index)
).
- Temel Türler: int, float, double, char, void
- const: Değişkeni sabit yapar.
- sizeof: Veri veya değişken boyutunu döner.
- Struct: Farklı veri türlerini gruplar.
- Bitfield: Hafızayı daha verimli kullanmak için bit seviyesinde alan tanımlar.
- Enum: Sabitlere anlamlı isimler verir.
- Union: Aynı bellek bölgesini farklı veri türleriyle kullanır.
typedef int tamsayi;
tamsayi value = 0;
struct Person {
char name[20];
int age;
};
typedef struct {
unsigned int month : 4;
unsigned int year : 11;
unsigned int day : 5;
} Date;
typedef struct {
uint8_t x;
uint16_t y;
} __attribute__((packed)) State_s;
- Snake Case: my_variable_name
- Camel Case: myVariableName
- Pascal Case: MyVariableName
- attribute: Yapıların bellekteki boşluklarını optimize eder.
- volatile: Optimize edilmemesi gereken değişkenlerde kullanılır.
// constructor int main önce çalışmasını sağlar.
// destructor int mainden sonra çaılmasını sağlar.
void __attribute__((constructor)) calledFirst();
void __attribute__((destructor)) calledLast();
void main() { printf("main"); }
void calledFirst() { printf("constructor\n"); }
void calledLast(){ printf("destructor\n"); }
// packed bellekte olan boşlukların doldurulmasını sağlar. normalde alta bulunan
// struct 32 byte olur fakat packed sayesinde 24 byte olur.
typedef struct {
uint8_t x;
uint16_t y;
} __attribute__((packed)) State_s;
State_s state_1
State_s state_2 = {1 ,2};
State_s state_3 = {0}; // Bütün verilere 0 atar.
State_s state_ptr;
state_ptr->x = 10; // ya da *(state_ptr).x = 10;
- Implicit: Otomatik tür dönüşüm.
- Explicit: Manuel tür dönüşüm.
int x = (int)3.14; // C tarzı
int y = static_cast<int>(3.14); // C++ tarzı
- Koşullar: if, else if, else, switch
- Döngüler: for, while, do-while
- Fonksiyonlar: Void dışındaki fonksiyonlar mutlaka dönüş yapmalıdır.
- Define ve Makrolar: Derleme zamanında sembolik isimler yaratır.
#define
sembolik isimler atanması için kullanılır. Değişkenlerin önüne boş bir #define koyarak, o değişkenin kullanım amacı hakkında bilgi verilebilir. #define bellek kısmında alan tutmaz derleme sırasında otomatik olarak düzeltilir.
#define MAX_SIZE 100
#define __MUTLAK_SONUC__ //boş define
int __MUTLAK_SONUC__ degisken;
- String (Karakter Dizileri): C dilinde, string (karakter dizileri) aslında karakterlerden oluşan dizilerdir. Karakter dizileri her zaman özel bir sonlandırıcı karakter
\0
(null terminatör) ile biter. Bu sonlandırıcı, dizinin sonunu belirtmek için kullanılır.
- Örneğin, 6 karakterlik bir metin için bellekte 7 byte'lık alan ayrılır (6 karakter + 1 null terminatör).
- Çift tırnak " içinde yazılan stringlere otomatik olarak
\0
eklenir. Ancak tek tırnak ' ile belirtilen karakter dizilerinde son karakter olarak manuel \0
eklenmelidir.
char str1[] = "Hello"; // Otomatik olarak \0 eklenir.
char str2[] = {'H', 'i', '\0'}; // Manuel olarak \0 eklenm
#include <stdarg.h>
if(printf("Hello World")) {} // Bir kez çalışır.
while(printf("Hello World")) {} // Sonsuz döngü.
for(int a = 0, b = 10; a < 10 && b > 2; a++, b--);
unsigned log int = size_t;
int array[5] = {[0 ... 4] = 5}; // Derleyiciye göre kabul edilir.
printf("%2.3f", num); // Sağ hizalı
printf("%-2.3f", num); // Sol hizalı
printf("%+2.3f", num); // Pozitif sayı önüne '+' koyar
printf("%05x", num); // Boşluklara 0 koyar
printf("%*.*f", 2,3,number); // '*' verilerin dışardan doldurulmasını sağlar.
printf("%#x", number); // '#' sayıların 0x şeklinde yazılmasını sağlar.
char buf[100];
sprintf(buf, "Sayı: %d", num);
sscanf(buf, "Sayı: %d", &num);
for(;;), while(true)
sonsuz döngüye örnektir.
continue
döngüyü başa alır. break
döngüden çıkar. return
fonksiyondan çıkar.
- Modern derleyiciler de
#pragma once
kullanılabilir.
// HEADER GUARDS
#ifndef SOME_UNIQUE_NAME_HERE
#define SOME_UNIQUE_NAME_HERE
#endif
int add(int a, int b); // prototip (declaration)
int add(int a, int b) { return a + b; } // Definition
int sum(int num, ...) { // değişken sayıda parametre alan fonksiyon
int total = 0;
va_list args;
va_start(args, num);
for (int i = 0; i < num; i++) {
total += va_arg(args, int);
}
va_end(args);
return total;
}
- Direct Acces: Bir değişkenin adını kullanarak erişmektedir.
- Indirect Access(Dolaylı Erişim): Pointer adresinden değişken erişimidir.
- Genel amaçlar için
void
veri tipi kullanılır. Bütün veri tipleri ataması yapılabilir.
Pointer
- Bir bellek adresini tutar ve yönetir.
- Pointer adresini (ptr), işaret edilen değeri (*ptr) ifade eder.
int val = 10;
int *ptr = &val;
Dinamik Bellek Yönetimi
- malloc: Bellekte belirtilen boyut kadar yer ayırır.
- calloc: Bellekte yer ayırır ve temizler.
- realloc: Daha önce ayrılan bellek alanını yeniden boyutlandırır.
- free: Ayrılan belleği serbest bırakır.
int *arr = (int*)malloc(sizeof(int)*10);
free(arr);
Temel Veri Yapıları
- Stack: Program derlenirken sabit boyutludur, LIFO mantığı kullanır.
- Heap: Çalışma zamanı sırasında dinamik bellek yönetimine izin verir.
- Linked List (Bağlı Liste): Veri parçalarını birbirine bağlayan pointerlarla dinamik hafıza yönetimi sağlar.