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.
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;
İş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 |
---|---|---|
(), [] | 1 | Soldan sağa |
*, tanımlayıcı | 2 | Sağdan sola |
Veri tipi | 3 | - |
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ı.