Şu C bildirimlerini okuyun: int *a[10]; int (*a)[10]; int (*a)(int); int (*a[10])(int); Karmaşık bildirimler nasıl çözülür?

Cevap

Karmaşık bildirimler sağ-sol (right-left / spiral) kuralı ile okunur: değişken adından başlayıp önce sağa ([] dizi, () fonksiyon), sonra sola (* pointer) bakılır; parantezler önceliği değiştirir.

BildirimAnlamı
int a;int
int *a;int'e pointer
int **a;int'e pointer'a pointer
int a[10];10 int'lik dizi
int *a[10];10 elemanlı, int pointer'larından oluşan dizi
int (*a)[10];10 int'lik bir diziye pointer
int (*a)(int);int alıp int döndüren fonksiyona pointer
int (*a[10])(int);int alıp int döndüren 10 fonksiyon pointer'ından oluşan dizi

Klasik zor örnek: signal()

void (*signal(int sig, void (*handler)(int)))(int);

Okuma: signal, bir int ve bir fonksiyon pointer'ı alan bir fonksiyondur; dönüş değeri int alıp void döndüren bir fonksiyona pointer'dır.

typedef ile okunur hale getirmek

typedef void (*sighandler_t)(int);
sighandler_t signal(int sig, sighandler_t handler);

typedef int (*op_fn)(int);
op_fn ops[10];                 /* int (*ops[10])(int) ile aynı */

Gömülü kullanım

  • int (*a)[10] bir 2D tamponun satırlarını gezmek için kullanılır: a++ 40 byte ilerler.
  • Fonksiyon pointer dizileri komut tabloları ve kesme vektör tablosunda kullanılır:
typedef void (*isr_t)(void);
__attribute__((section(".isr_vector")))
const isr_t vector_table[] = { Reset_Handler, NMI_Handler, HardFault_Handler };

cdecl aracı (cdecl explain "int (*a[10])(int)") bildirimleri doğrulamak için kullanışlıdır. Kodda ise karmaşık bildirimleri her zaman typedef ile sadeleştirmek okunabilirliği artırır.

  1. C dilinde volatile anahtar kelimesi ne işe yarar?OrtaC ProgramlamaEmbedded
  2. Bir yazmaçtaki belirli bir biti set, clear ve toggle eden C kodunu yazın.KolayC ProgramlamaEmbedded
  3. Stack ile heap arasındaki fark nedir? Gömülü sistemlerde dinamik bellek kullanımından neden kaçınılır?OrtaC ProgramlamaEmbedded
  4. Endianness nedir? Little-endian ile big-endian farkı nedir?KolayC ProgramlamaEmbedded
  5. Bit field nedir? Donanım register'larına erişimde bit field mi yoksa bit maskesi mi kullanılmalı?OrtaC ProgramlamaEmbedded
  6. Fonksiyon pointer'ları ve callback tabloları gömülü sistemlerde nasıl kullanılır? Bir state machine örneği verin.OrtaC ProgramlamaEmbedded

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle