Temel C Programlama -36- İşaretçi ve Değer Sabitleri

Değişkenleri size anlattığımız zaman const anahtar kelimesi ile bir değişkeni bir değişken sabiti haline getirebileceğimizi söylemiştik. Aynı özelliği işaretçiler için de kullanmamız mümkündür. Yalnız işaretçi boyutundan baktığımız zaman işaretçilerin kendisi olduğu gibi işaret ettiği eleman da söz konusudur. O halde karşımıza dört ayrı ihtimal çıkmaktadır.

  • Sabit olmayan işaretçi ve sabit olmayan değişken

  • Sabit işaretçi ve sabit olmayan değer

  • Sabit olmayan işaretçi ve sabit değer

  • Sabit işaretçi ve sabit değer

Biz daha önceki başlıklarda sabit olmayan işaretçi ve sabit olmayan değerler ile program yazmıştık. O yüzden bunu atlayarak bu konuda sadece sabit değişken ve işaretçileri kullanarak program yazacağız. Tahmin edeceğiniz üzere sabit işaretçi tek bir değer alır ve program boyunca o değer asla değişmez. İşaretçi olduğu için tek bir adres değeri alır ve program boyunca o adres değerini gösterir. Sabit olmayan işaretçi sabit bir değeri işaret edebildiği gibi başka bir değeri de gösterebilir. Yalnız sabit değere geldiği zaman “*” operatörü ile bu sabit değişkenin değerine erişebilse de bu değer üzerinde herhangi bir değişiklik yapamaz. Sabit işaretçi ve sabit değer beraber kullanıldığı zaman ne işaretçinin adresi üzerinde ne de değişken üzerinde bir işlem yapılabilir.

Şimdi değişken bir işaretçi ile sabit bir veri örneğini yapalım.

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

void karakterYazdir (const char *stringP);
int main(int argc, char *argv[]) {
	char string[] = "Bu bir karakter dizisidir!";
	puts("Karakter Dizimiz:");
	karakterYazdir ( string );
	
	return 0;
}

void karakterYazdir (const char *stringP)
{
	while (*stringP != '\0')
	{
	printf("%c", *stringP);
	stringP++;	
	}	
	printf("\n");
}

Programı çalıştırdığımızda ekran görüntüsü şu şekilde olacaktır.

Burada sabit veri olarak belirttiğimiz karakter dizisi main() fonksiyonu içerisinde sabit değildir. Ama ne zaman yazdırma fonksiyonuna gelirse o zaman void karakterYazdir (const char *stringP) diyerek sabit hale gelmektedir. Burada sabit verinin olması işaretçinin asla veri üzerinde değişiklik yapamayacağı anlamına gelir. Bu verinin değiştirilmeden güvenle ekrana yazılmasını sağlar. Aynı zamanda bizim burada işaretçimiz sabit olmadığı için stringP++; komutu ile işaretçinin değerleri ile oynayabilir ve bütün diziyi yazdırabiliriz.

Sabit İşaretçi ve Değişken Değer

Sabit işaretçi ve değişken işaret edilen değer örneğinde her zaman işaretçi aynı hafıza bölümünü göstermektedir. Aynı hafıza bölümünü göstermesine karşın içindeki değeri istediği gibi değiştirebilir. Buna en iyi örnek olarak dizi adlarını verebiliriz. Dizi adları değişmeyen birer işaretçidir ve her zaman dizinin ilk elemanını işaret etmektedir. Biz sabit bir işaretçi tanımlıyorsak muhakkak değerini ilk tanımlamada vermek zorundayız. Örnek bir sabit işaretçi tanımlaması şu şekilde olabilir.

int * const ptr = &degisken;

Sabit İşaretçi ve Sabit Değer

Bu örnekte en az erişim imkanı verilmiş olur. Sabit işaretçi aynı hafıza birimini işaret ettiği gibi sabit veri de program akışı boyunca değiştirilemez. Dizi değişkenleri fonksiyonlara argüman olarak aktarılırken bu halde aktarılır. Yani aktarılan diziden sadece okuma yapılır ve herhangi bir değişiklik yapılamaz. Sabit işaretçi ve sabit değeri şu şekilde tanımlayabiliriz.

const int * const ptr = &degisken;

Buraya kadar işaretçilere dair fonksiyon işaretçilerinden başka konumuz kalmadı. Bir sonraki konuda onu ele aldıktan sonra işaretçiler konusunu bitireceğiz. Gördüğünüz gibi hiç de zor değilmiş, değil mi?

Last updated