const int *p, int * const p ve const int * const p arasındaki fark nedir?
Cevap
Kural: `const` solundaki şeye uygulanır; solunda bir şey yoksa sağındakine. Bildirimi sağdan sola okumak işi kolaylaştırır.
| Bildirim | Okunuşu | Veri değişir mi? | Pointer değişir mi? |
|---|---|---|---|
const int *p | p, const int'e pointer | Hayır | Evet |
int const *p | Yukarıdakiyle aynı | Hayır | Evet |
int * const p | p, int'e const pointer | Evet | Hayır |
const int * const p | const int'e const pointer | Hayır | Hayır |
int a = 1, b = 2;
const int *p1 = &a;
/* *p1 = 5; HATA */
p1 = &b; /* OK */
int * const p2 = &a;
*p2 = 5; /* OK */
/* p2 = &b; HATA */
const int * const p3 = &a; /* ikisi de yasak */Gömülü sistemlerde neden önemli?
- Fonksiyon sözleşmesi:
void send(const uint8_t *buf, size_t len)fonksiyonun tamponu değiştirmeyeceğini garanti eder ve string literal geçirilebilir. - Flash'a yerleşim:
constglobal tablolar (lookup table, font) genelde.rodatabölümüne, yani Flash'a konur ve değerli RAM harcamaz.
static const uint16_t sine_lut[256] = { /* ... */ };- Register tanımları: Sabit adresli ama içeriği değişen register için
volatile uint32_t * const REG. Salt okunur bir durum register'ı içinconst volatile uint32_t *; yazılım değiştiremez, donanım değiştirebilir.
const volatile birlikte kullanılabilir ve çelişkili değildir: "ben değiştirmem ama değer değişebilir".
İlgili C Programlama soruları
- C dilinde volatile anahtar kelimesi ne işe yarar?
- Bir yazmaçtaki belirli bir biti set, clear ve toggle eden C kodunu yazın.
- Stack ile heap arasındaki fark nedir? Gömülü sistemlerde dinamik bellek kullanımından neden kaçınılır?
- Endianness nedir? Little-endian ile big-endian farkı nedir?
- Bit field nedir? Donanım register'larına erişimde bit field mi yoksa bit maskesi mi kullanılmalı?
- Fonksiyon pointer'ları ve callback tabloları gömülü sistemlerde nasıl kullanılır? Bir state machine örneği verin.
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.