POINTERLAR Pointer, otel danışmadaki kim hangi odada kalıyor listesindeki oda numaralarını yazdığımız kutular gibidir. Bu kutunun içine bakarsın, ulaşmak istediğin adamın oda numarasını öğrenir, ona göre gidersin. İleride bir gün geldiğinde tekrar listeye bakarsın, adamın oda numarasının değiştiğini görüp ona göre yeni odaya gidebilirsin mesela. Eğer bu sürekli değişen liste olmasaydı adamı kurşuna dizmek için eski odasına gittiğinde farklı birisiyle karşılaşıp yanlışlıkla onu vurabilirdin! Bu da malfunction denilen yanlış çalışmaya sebep olabilirdi. Veya, orada adamı bulamayıp sapıtabilirdin. Tüm bu kötü durumları engellemek, dinamik bir erişim sağlamak için pointer kullanıyoruz. Pointerın, bir içeriği var. Biz bu içerikle ilgileniyoruz. Bu içerik ise bir adres. Diyelim ki int aPtr; diye bir pointer var ve bunun içinde A394DE yazyıyor(salladım). Biz, bu adresteki sayının değerine ulaşmak için pointerin adının başına * koyuyoruz. yani printf("%d",*aPtr); dediğimizde aPtr'in işaret ettiği sayının değerini bastırmış oluyoruz. Mesela 18 olsun... Peki bu pointerin içeriğindeki adresi nasıl belirleyebiliriz? Bunun için & işaretini kullanacağız. int sayi=18; aPtr=&sayi; Aşağıdaki ifadelerin ikisi de 18 bastırır. printf("%d",*aPtr); printf("%d",sayi); Aşağıdaki ifadelerin ikisi de A394DE (sayi'nın adresini) bastırır. printf("%p",aPtr); printf("%p",&sayi); ----------- Şimdi de biraz stringlere geçelim. Stringler ise karakter dizi(array)leridir. Arrayler ise aynı zamanda bir pointer gibi davranır. Mesela, char kelime[30]; Burada kelime ifadesi bu dizinin ilk elemanının adresini söyler bize. kelime+1 ifadesi ikinci elemanın adresini kelime+2 ifadesi üçüncü elemanın adresini... O halde, adresleri biliyorsak, bunların değerlerini nasıl okuyabiliriz? * ile tabii ki! *kelime => kelimenin ikinci elemanındaki adresteki harfin değerini, mesela 'A' verir. *(kelime+1) => kelimenin ikinci elemanındaki adresteki harfin değerini verir. Mesela 'h' Örn: for (i=0;i<5;i++) printf("%c",*(kelime+i)); dersek, bu yazının ilk 5 harfini (0,1,2,3,4) bastırmış oluruz. Bir de, eğer bu kelimenin tamamını bastırmak istersek, puts(kelime); diyebiliriz. puts fonksiyonu, stringi okumaya başlar. '\0', yani sonlandırıcı(terminating) karakteri görene kadar okur, gördüğü zaman okumayı bırakır. Bildiğimiz üzere stringlerin nerede bittiğini tespit etmek için son elemanını '\0' yapıyorduk. char cumle[10]; for (i=0;i<6;i++) *(cumle+i)='A'+i; *(cumle+i)='\0'; Bu program parçası, cumle stringine yazmaya başlar. 0. elemana A yazar. 1. elemana B 2. elemana C ... D E 5. elemana F For bittikten sonra da, i 6 idi.(zaten 6 olduğu için for devam etmedi). *(cumle+i)='\0' ile de 6. elemana \0 yazdık. Böylece stringi okunabilir hale getirdik. puts(cumle) dediğimizde 6. elemana gelince okuma sona eriyor. Normalde 10 tane hafızası olmasına rağmen '\0'yı görünce devam etmiyor. Bir de karıştırma örneği yapalım: #include #include int main(){ char cumle[10]="ABCDEFGHI"; int i,rastgelesira; char gecici; srand(time(NULL)); for (i=0;i<9;i++){ //9. indisteki (10.) eleman '\0' olduğu için onu hesaba katmadım rastgelesira=rand()%9; //9'dan kucuk bir sayi olusturuyor gecici=cumle[i]; cumle[i]=cumle[rastgelesira]; cumle[rastgelesira]=gecici; } puts(cumle); return 0; } i Bu kod, "ABCDEFGHI" cümlesinin harflerini karıyor. Bu işi de şöyle yapıyor: * 9'dan küçük, indis olarak kabul edebileceğimiz rastgele bir sayı üret=rastgelesira. * i indisindeki harfi bu indisteki harfle değiştireceğiz. - i indisindeki harfi gecici bir degiskene ata. - i indisine rastegelesira indisindeki harfi yaz. - rastgelesira indisine de gecici degiskeninde depoladigimiz i indisindeki eski harfi koy. * Bunu ilk harften son harfe kadar tekrarla (for ile)