logo

C İşaretçileri

C dilinde işaretçi, başka bir değişkenin adresini saklayan bir değişkendir. Bu değişken int, char, array, function veya başka herhangi bir işaretçi türünde olabilir. İşaretçinin boyutu mimariye bağlıdır. Ancak 32 bit mimaride işaretçinin boyutu 2 bayttır.

Bir tamsayının adresini saklayan bir işaretçiyi tanımlamak için aşağıdaki örneği göz önünde bulundurun.

 int n = 10; int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer. 

Bir işaretçi bildirmek

C dilinde işaretçi * (yıldız işareti) kullanılarak bildirilebilir. Bir işaretçinin referansını kaldırmak için kullanılan dolaylı işaretçi olarak da bilinir.

 int *a;//pointer to int char *c;//pointer to char 

İşaretçi Örneği

Adresi ve değeri yazdırmak için işaretçilerin kullanımına ilişkin bir örnek aşağıda verilmiştir.

işaretçi örneği

Yukarıdaki şekilde gördüğünüz gibi işaretçi değişkeni sayı değişkeninin yani fff4'ün adresini saklar. Sayı değişkeninin değeri 50'dir. Ancak p işaretçi değişkeninin adresi aaa3'tür.

* yardımıyla ( dolaylı operatör ), p işaretçi değişkeninin değerini yazdırabiliriz.

css sınırı

Yukarıdaki şekil için açıklandığı gibi işaretçi örneğini görelim.

 #include int main(){ int number=50; int *p; p=&number;//stores the address of number variable printf('Address of p variable is %x 
',p); // p contains the address of the number therefore printing p gives the address of number. printf('Value of p variable is %d 
',*p); // As we know that * is used to dereference a pointer therefore if we print *p, we will get the value stored at the address contained by p. return 0; } 

Çıktı

 Address of number variable is fff4 Address of p variable is fff4 Value of p variable is 50 

Dizi işaretçisi

 int arr[10]; int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr. 

Bir işlevin işaretçisi

 void show (int); void(*p)(int) = &display; // Pointer p is pointing to the address of a function 

Yapı işaretçisi

 struct st { int i; float f; }ref; struct st *p = &ref; 
c işaretçileri

İşaretçinin avantajı

1) İşaretçi kodu azaltır Ve performansı artırır dizeleri, ağaçları vb. almak için kullanılır ve diziler, yapılar ve işlevlerle birlikte kullanılır.

2) Yapabiliriz bir işlevden birden çok değer döndürme işaretçiyi kullanarak.

3) Yapabilmenizi sağlar herhangi bir hafıza konumuna erişin bilgisayarın belleğinde.

İşaretçinin kullanımı

C dilinde işaretçilerin birçok uygulaması vardır.

ikili arama

1) Dinamik hafıza tahsisi

C dilinde, işaretçinin kullanıldığı malloc() ve calloc() fonksiyonlarını kullanarak dinamik olarak bellek ayırabiliriz.

2) Diziler, Fonksiyonlar ve Yapılar

java dinamik dizi

C dilinde işaretçiler dizilerde, işlevlerde ve yapılarda yaygın olarak kullanılır. Kodu azaltır ve performansı artırır.

(&) Operatörün Adresi

'&' operatörünün adresi bir değişkenin adresini döndürür. Ancak bir değişkenin adresini görüntülemek için %u kullanmamız gerekir.

 #include int main(){ int number=50; printf('value of number is %d, address of number is %u',number,&number); return 0; } 

Çıktı

 value of number is 50, address of number is fff4 

Boş işaretçisi

NULL dışında herhangi bir değer atanmayan işaretçi, NULL işaretçisi olarak bilinir. Bildirim sırasında işaretçide belirtilecek herhangi bir adresiniz yoksa NULL değeri atayabilirsiniz. Daha iyi bir yaklaşım sağlayacaktır.

 int *p=NULL; 

Çoğu kütüphanede işaretçinin değeri 0'dır (sıfır).

3. değişkeni kullanmadan iki sayının yerini değiştiren İşaretçi Programı.

 #include int main(){ int a=10,b=20,*p1=&a,*p2=&b; printf('Before swap: *p1=%d *p2=%d',*p1,*p2); *p1=*p1+*p2; *p2=*p1-*p2; *p1=*p1-*p2; printf('
After swap: *p1=%d *p2=%d',*p1,*p2); return 0; } 

Çıktı

 Before swap: *p1=10 *p2=20 After swap: *p1=20 *p2=10 

Karmaşık işaretçileri okuma

C'deki karmaşık işaretçileri okurken dikkate alınması gereken birkaç şey vardır. İşaretçilerle ilgili olarak kullanılan operatörlerin önceliklerini ve ilişkilendirilebilirliğini görelim.

ŞebekeÖncelikçağrışımsallık
(), []1Soldan sağa
*, tanımlayıcı2Sağdan sola
Veri tipi3-

Burada şunu fark etmemiz gerekiyor;

  • (): Bu operatör, işlevi bildirmek ve tanımlamak için kullanılan bir parantez operatörüdür.
  • []: Bu operatör bir dizi abone operatörüdür
  • * : Bu operatör bir işaretçi operatörüdür.
  • Tanımlayıcı: İşaretçinin adıdır. Öncelik her zaman buna verilecektir.
  • Veri türü: Veri türü, işaretçinin işaret etmesi amaçlanan değişkenin türüdür. Ayrıca, Signed int, long vb. gibi değiştiricileri de içerir.

İşaretçi nasıl okunur: int (*p)[10].

İşaretçiyi okuyabilmek için () ve [] öğelerinin eşit önceliğe sahip olduğunu görmeliyiz. Bu nedenle burada onların birlikteliği dikkate alınmalıdır. İlişkisellik soldan sağa olduğundan öncelik ()'ye gider.

java dizeyi int'ye ayrıştırma

Parantez () içinde işaretçi operatörü * ve işaretçi adı (tanımlayıcı) p aynı önceliğe sahiptir. Bu nedenle, burada sağdan sola olan ilişkisellikleri dikkate alınmalıdır, dolayısıyla öncelik p'ye, ikinci öncelik ise *'a gider.

Veri türü son önceliğe sahip olduğundan 3. önceliği [] öğesine atayın. Bu nedenle işaretçi aşağıdaki gibi görünecektir.

  • karakter -> 4
  • * -> 2
  • p -> 1
  • [10] -> 3

İşaretçi, p'nin 10 boyutunda bir tamsayılar dizisinin işaretçisi olduğu şeklinde okunacaktır.

Örnek

Aşağıdaki işaretçi nasıl okunur?

 int (*p)(int (*)[2], int (*)void)) 

Açıklama

Bu işaretçi, p'nin, ilk parametreyi iki boyutlu tamsayılardan oluşan tek boyutlu bir diziye işaretçi olarak ve ikinci parametreyi, parametresi geçersiz ve dönüş türü olan bir işleve işaretçi olarak kabul eden böyle bir işleve yönelik bir işaretçi olduğu şeklinde okunacaktır. tamsayı.