C Programlama
C Programlama
Alper Bayrak
¨
Abant ˙Izzet Baysal Universitesi
Bolu
2014
C Programlama
Sunuma Genel Bakı¸s
Sunuma Genel Bakı¸s I
¨
1 GOSTERGELER
G¨osterge De˘gi¸skenleri ve ˙I¸slemleri
˙sle¸cleri
& ve * I¸
G¨
osterge De˘
gi¸skenleri Bildirimleri
G¨
osterge Aritmeti˘
gi
G¨ostergeler ve Diziler
Karakter Dizileri
Bitsel ˙I¸sle¸cler
˙sleci
Bire T¨
umler I¸
˙sle¸cleri
Kaydırma I¸
˙sleci
Bitsel VE I¸
˙sleci
Bitsel XOR I¸
˙sleci
Bitsel VEYA I¸
˙sle¸cleri
Atama I¸
¨
Bir Ornek-Sayı
Paketleme
˙I¸sle¸c Onceli˘
¨
gi ve Birle¸sme
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge De˘gi¸skenleri ve ˙I¸slemleri
G¨ostergeler ve g¨osterge i¸slemleri C’nin ¸cok ¨
onemli bir y¨on¨
un¨
u
olu¸stururlar.
G¨ostergeler, ba¸ska de˘
gi¸skenlerin adreslerini veya daha genel
konu¸sursak, bellek konumlarını depolamaya yarayan
de˘gi¸skenlerdir.
G¨ostergeler kullanmak suretiyle daha kısa ve hızlı ¸calı¸san bir
kod yazabiliriz, ancak bu kodu anlamak daha zor olabilir,
ayrıca hata yapma olasılı˘
gı da artabilir.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge De˘gi¸skenleri ve ˙I¸slemleri
¨ gin, bir int dizisini ”temizlemeye” yarayan
Orne˘
int z[N], i;
...
for (i=0; i<N; i++)
z[i] = 0;
¸seklindeki klasik for deyiminin yerine
int z[N], *g;
...
for (g=&z[0]; g<&z[N]; g++)
*g = 0;
kullanılabilir; bu da daha verimli (hızlı) oldu˘
gu i¸cin bazı programcılar
tarafından tercih edilebilir.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
& ve * ˙I¸sle¸cleri
Zaman zaman, bir de˘
gi¸skenin depolandı˘
gı bellek b¨olgesinin
adresini elde etmek gerekebilir.
Bunu yapmak i¸cin, adres alma (&) i¸slecini kullanırız.
Di˘ger tekli i¸sle¸clerle aynı ¨
onceli˘
ge sahip olan bu tekli i¸sle¸c,
bellekte belli bir konumda bulunan i¸slenenlere uygulanabilir.
¨ gin, bu i¸slenen basit bir de˘
Orne˘
gi¸sken (&degisken) veya bir
dizi elemanı (&dizi[indis]) olabilir.
& i¸sleci i¸slenenin adresini (daha do˘
grusu, i¸slenen tarafından
tutulan belle˘gin ilk baytının adresini) verir.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
& ve * ˙I¸sle¸cleri
Bunun ne anlama geldi˘
gine bakalım. Her de˘
gi¸sken (ana)
bellekte bir yerde saklanır.
Bilgisayar belle˘gi sınırlıdır; herbiri bir sayı verilerek adreslenen
belirli sayıda h¨
ucrelerden olu¸sur.
Her h¨
ucre belirli bir miktarda bilgi i¸cerir.
En k¨
u¸cu
¨k bilgi birimi bittir (binary digit-ikili rakam) ve 0/1,
do˘gru/yanlı¸s, a¸cık/kapalı gibi, iki olası de˘
gerden bir tanesini
saklamaya yarar.
Bir bit, rahat olarak i¸slenmesi i¸cin ¸cok k¨
u¸cu
¨k bir bilgi
birimidir.
Bundan dolayı, bitler, genelde 8 bitten olu¸san bir bayt veya
makineden makineye 8 ile 64 bit arasında de˘
gi¸sen sayıda
bitten olu¸san bir s¨
ozc¨
uk ¸seklinde gruplandırılır.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
& ve * ˙I¸sle¸cleri
Bizim sistemde, bir bayt 8, bir s¨
ozc¨
uk de 16 bittir (”16 bitlik”
derleyiciler i¸cin); bilgisayar belle˘
gi bayt ¸seklinde adreslenir;
arka arkaya gelen baytlar i¸cin arka arkaya gelen adresler
kullanılır; normal boyda bir tamsayı de˘
gi¸skeni bir s¨ozc¨
uk yani
iki bayt kaplar.
B¨oylece, iki tamsayıdan olu¸san bir dizi (int z[2];) d¨ort bayt
kaplar.
E˘ger ilk elemanın adresi, ¨
orne˘
gin, 140’sa, ikinci elemanınki
142 olacaktır.
Adres alma i¸sleci bu sayıları verecektir. Di˘
ger bir de˘gi¸sle,
&z[0] 140’a e¸sitse, &z[1] de 142’ye e¸sittir.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
& ve * ˙I¸sle¸cleri
Adres elimizde oldu˘
gu zaman, bu sefer o adreste saklanmı¸s
olan de˘geri elde etmek i¸cin bir y¨
onteme gerek duyarız.
Bu, temelde & i¸slecinin aksi olan, dolaylama (*) i¸sleci ile
yapılır.
Bu i¸sle¸c c¸arpım i¸sleci ile karı¸stırılmamalıdır, c¸u
¨nk¨
u bu tekli,
oysa c¸arpım i¸sleci ikili bir i¸sle¸ctir.
Dolaylama i¸sleci di˘
ger tekli i¸sle¸clerle aynı ¨
onceli˘ge sahiptir ve
b¨
ut¨
un tekli i¸sle¸cler gibi sa˘
gdan sola birle¸sir.
Bu da, e˘ger yan yana iki tekli i¸sle¸c varsa, ¨
once sa˘gdakinin
¸calı¸saca˘gını g¨osterir.
¨ gin, *&x ile *(&x) aynı anlama gelir, ve her ikisi de,
Orne˘
a¸sa˘gıda a¸cıklanaca˘
gı gibi x’e e¸sde˘
gerdir.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
& ve * ˙I¸sle¸cleri
Dolaylama i¸sleci, i¸slenen olarak ge¸cerli bir adres bekler ve bu
adreste saklanmı¸s bulunan de˘
geri verir.
Ancak bunu yapması i¸cin hangi veri tipinde bilgi vermesi
gerekti˘gini bilmek zorundadır; int, double, char yoksa ba¸ska
bir ¸sey mi?
¨ gin, &x, x de˘gi¸skeninin
Bu bilgi i¸sleneninde gizlidir. Orne˘
tipindeki bir bilgiyi tutan bellek b¨
olgesinin adresidir (teknik
terimi ile, bu adrese bir g¨
ostergedir).
Yani, e˘ger x bir char de˘
gi¸skeni ise, &x bir char g¨ostergesidir,
b¨oylece *&x, &x ile g¨
osterilen b¨
olgede saklanmı¸s bulunan char
de˘gerini verir.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge De˘gi¸skenleri Bildirimleri
G¨osterge bildirimleri basittir.
int i, j;
bildirimi nasıl tamsayı de˘
gi¸skenleri tanımlarsa,
int *ig, *jg;
bildirimi de tamsayı tipindeki de˘
gi¸skenlere g¨
ostergeler
tanımlayacaktır.
ig ve jg gibi g¨osterge de˘
gi¸skenleri tamsayı de˘
gi¸skenlerinin
adreslerini i¸cerecektir.
¨ gin:
Orne˘
ig = &i;
jg = &j;
anlamlı atamalardır.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge De˘gi¸skenleri Bildirimleri
Ancak
ig = j;
¸seklindeki atama, j’nin de˘
gerini adres bilgisi olarak ig’ye
koyacaktır ve ancak j de˘
gi¸skeni i¸cindeki tamsayı de˘gerinin bir
adres olarak kullanılması gerekti˘
gi durumlarda i¸se yarayabilir.
C Standardına uygun derleyiciler b¨
oyle atamalar oldu˘gunda
sizi uyaracaktır, ¸cu
¨nk¨
u de˘
gi¸skenlerin tipleri uymamaktadır.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge De˘gi¸skenleri Bildirimleri
Aynı ¸sekilde,
double *dg;
double’a bir g¨osterge tanımlar. Hem ig hem de dg adres
saklarlar.
Fakat neyin adresi? Derleyicinin bunu bilmesi gerekir.
¨ gin,
Bundan dolayı farklı tanımlar yapmak zorundayız. Orne˘
dg = &i;
derleyici tarafından kabul edilebilir, ancak anlamsızdır, c¸u
¨nk¨
u
dg, bir double yerine bir tamsayıyı g¨
osterecektir.
Derleyiciler bu tip yanlı¸s atamalarda sizi uyaracaktır.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge Aritmeti˘gi
Bu kısım ba¸sında verilen ¨
orne˘
ge geri d¨
onelim
int z[N], i;
...
for (i=0; i<N; i++)
z[i] = 0;
Dizi bildirimi, derleyicinin dizi i¸cin, ana bellekte yer ayırmasını
sa˘
glar.
Bir int de˘
gi¸skeninin 2 bayt tuttu˘
gunu ve N’nin 10 olarak #define ile
tanımlandı˘
gını varsalım.
Bu durumda z dizisi 20 bayt tutacaktır.
˙Ilk eleman, adresi &z[0] ifadesi ile elde edilen yerde saklanır.
(Tanım gere˘
gi &z[0] ile z aynı ¸seydir ve buna dizinin temel adresi
denir.
Di˘
ger bir deyi¸sle, bir ifade i¸cinde indissiz kullanılan dizi isimleri
belirli bellek b¨
olgelerini g¨
osterirler, yani g¨
ostergedirler.)
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge Aritmeti˘gi
Bir dizinin i’inci elemanını elde etmek i¸cin (¨
orne˘gin z[i]
yazıldı˘gında), derleyici ¸sunu yapar: Dizinin temel adresini
(yani ilk elemanının adresini) alır (¨
orne˘
gin 8566), sonra indisin
de˘gerini alır (¨orne˘
gin 3) ve e˘
ger dizinin eleman tipi n tane
bayt kullanıyorsa (¨
orne˘
gin, bizim sistemde tamsayılar i¸cin bu 2
bayttır) i’inci elemanın adresini bulmak i¸cin TemelAdres+nxi
hesaplar.
S¸imdi dizi indislerinin neden sıfırdan ba¸sladı˘
gı daha iyi
anla¸sılıyor; e˘ger i sıfıra e¸sitse, o zaman ikinci terim yok olur
ve, olması gerekti˘
gi gibi, dizinin ilk elemanının adresinin
ger¸cekte dizinin temel adresi oldu˘
gu ortaya ¸cıkar.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge Aritmeti˘gi
int z[N], i;
int z[N], *g;
...
...
for (i=0; i<N; i++)
for (g=&z[0]; g<&z[N]; g++)
z[i] = 0;
*g = 0;
for deyimlerimize geri d¨
onersek, ilkinde bu hesaplamanın her
yinelemede tekrarlandı˘
gını g¨
or¨
ur¨
uz. ˙Ikinci durumda ise, a¸cık¸ca bir
g¨osterge kullanılmı¸stır.
Tamamen
for (g=z; g<&z[N]; g++)
*g = 0;
deyimiyle e¸sde˘ger olan bu deyim, ¨
once g int g¨
ostergesine z dizisinin
temel adresini koyar (¨
orne˘
gin 8566); daha sonra g ile i¸saretlenmi¸s
b¨olgeye sıfır koyar.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge Aritmeti˘gi
Bu adreste (yani 8566’da) saklanacak olan de˘gerin tipinin
derleyici tarafından bilinmesi gerekir, int, char, double, yoksa
ba¸ska bir ¸sey mi? Bunu g¨
ostergenin tipinden belirler.
Bu bir tamsayı g¨ostergesi oldu˘
guna g¨
ore, bu g¨osterge
tarafından i¸saret edilen b¨
olgede bir tamsayı de˘gi¸skeni
bulunmalıdır.
Bundan dolayı 8566 ve 8567 adresli baytlara sıfır yerle¸stirir.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge Aritmeti˘gi
Bundan sonra g¨osterge artırılır.
S¸imdi yine bir sorunumuz var demektir, c¸u
¨nk¨
u sayılar i¸cin
artırma (veya azaltma) elimizdeki de˘
gere bir sayısı eklenerek
(veya c¸ıkarılarak) yapılır. Aynı ¸sey g¨
ostergelere uygulanamaz.
g’nin g¨osterdi˘gi adresin de˘
gerine bir eklenmesi, g¨ostergenin
dizideki bir sonraki elemana (yani 8568 adresine) i¸saret
etmesini sa˘glayamayacaktır; onun yerine, ilk elemanı i¸ceren
”s¨ozc¨
u˘gu
¨n” ikinci yarısını (yani 8567 adresini) g¨osterecektir.
G¨osterge ile g¨osterilen elemanın boyuna e¸sit bir sayı (yani
bizim sistemimizde tamsayılar i¸cin 2) eklemeliyiz. Bu, derleyici
tarafından bizim i¸cin yapılır.
Yani, int g¨ostergesi ”++” i¸sleci ile artırıldıktan sonra 8568
adresini g¨ostermeye ba¸slayacaktır. De˘
gi¸sik tipteki
g¨ostergelerin uyumlu olmamalarının nedenleri i¸ste bu
farklılıklardır.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge Aritmeti˘gi
G¨osterge aritmeti˘
ginin di˘
ger ¸sekillerinde de benzer bir sorun
ortaya c¸ıkar.
¨ gin, e˘ger g’de 8566 (&z[0]) adresi varsa, g+3 ifadesi
Orne˘
nereyi g¨ostermelidir? 8569 adresini mi? Hayır!
Bu, z[1]’i i¸ceren s¨
ozc¨
u˘
gu
¨n ikinci yarısının adresi demektir ki
fazla anlamlı bir ¸sey de˘
gildir.
Daha iyisi &z[3] (yani 8572) adresine i¸saret etmesi olacaktır.
Yine, derleyici bize bunu sa˘
glar: Bir adrese (g¨ostergeye), z,
bir tamsayı, i, ekledi˘
gimizde (veya ¸cıkardı˘
gımızda), derleyici z
tarafından i¸saret edilen de˘
gi¸sken tipinin boyunu i ile ¸carpar ve
sonra toplama (veya ¸cıkarmayı) yapar.
Bunun nedeni adreslerin her zaman baytlara i¸saret etmelerine
kar¸sılık, g¨ostergelerin de˘
gi¸sik b¨
uy¨
ukl¨
uklere sahip tipte nesneleri
g¨ostermeleridir.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge Aritmeti˘gi
Bu anlatılanların anafikri g¨
ostergelerin tamsayı olmadıkları ve
bazı i¸sle¸clerin (++, - -, +, -, +=, -=) g¨
ostergeler i¸cin farklı
uygulandıklarıdır.
*g ile g¨osterilen de˘
gi¸skenin n bayt kapladı˘
gını varsayın. O
zaman,
g++
g- g+tamsayi ifade
g-tamsayi ifade
g¨osterge ifadeleri sırasıyla g+n, g-n, g+nxtamsayı ifade,
g-nxtamsayı ifade ¸seklinde hesaplanır.
Ayrıca p1 ve p2 aynı tipten g¨
ostergelerse, de˘
geri bir tamsayı
olan
p1-p2
ifadesi (p1-p2)/n ¸seklinde hesaplanır.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge Aritmeti˘gi
¨ gin,
Orne˘
p1 = &z[3];
p2 = &z[0];
printf(”%d\n”, (int)(p1-p2));
(z dizisinin eleman tipine ba˘
glı olmaksızın) c¸ıktı olarak 3
verecektir.
˙Iki g¨ostergeyi birbirinden c¸ıkardı˘
gımızda, kullanılan sistemdeki
bellek boyuna ba˘glı olan bir tipte bir ifade olu¸stu˘guna dikkat
edin.
˙I¸saretli olan bu tip stddef.h adlı ba¸slık dosyasında uygun bir
¸sekilde prtdiff t adıyla tanımlanmı¸stır.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge Aritmeti˘gi
˙Iki uyumlu g¨osterge (<, >, <=, >=, == ve != kullanarak)
kar¸sıla¸stırılabilir, ancak farklı dizilerdeki nesnelere i¸saret eden
iki g¨ostergeyi kar¸sıla¸stırmak anlamlı (en azından ta¸sınabilir bir
¨ozellik) de˘gildir.
Do˘gal olarak, bunun nedeni iki dizinin ana bellekteki birbirine
g¨ore durumları konusunda emin olamayaca˘
gınızdır.
Bu kısımdaki ikinci for’da kullanılan ”g<&z[N]” testi
uygundur, ¸cu
¨nk¨
u g ve &z[N] aynı dizi i¸cindeki (olası de˘gi¸sik)
yerlere i¸saret ederler.
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge Aritmeti˘gi
&z[N] adresi, z dizisinin i¸cinde de˘
gildir, zira dizinin son
elemanı z[N-1]’dir.
Ancak g’nin bu ”ge¸cersiz” adrese i¸saret etti˘
gi zaman *g’ye
bir¸sey atamamak i¸cin, <= yerine <kullanılır.
C Standardı ise, bir nesnenin sınırları dı¸sında adres u
¨retmeyi
(o adresteki b¨olge de˘
gi¸stirilsin de˘
gi¸stirilmesin) a¸cık¸ca
yasaklamaktadır.
Tek istisna olarak, bir nesnenin son baytından bir sonraki
baytı g¨osteren adresi u
¨retmeye izin verir.
˙ste bu ¨ozellik ”g<&z[N]”de kullanılmı¸stır.
I¸
C Programlama
¨
GOSTERGELER
G¨
osterge De˘
gi¸skenleri ve ˙I¸slemleri
G¨osterge Aritmeti˘gi
Bir g¨osterge (== veya != kullanılarak) 0 tamsayı
de˘gi¸smeziyle kar¸sıla¸stırılabilir.
Geleneksel olarak 0 de˘
gerinin hi¸c bir ¸seyi g¨
ostermedi˘gi
varsayılmı¸stır.
Bu tamsayı de˘gi¸smezi programlarda o kadar ¸cok
kullanılmaktadır ki stdio.h ba¸slık dosyasında
#define NULL 0
¸seklinde bir tanımlama yapılmı¸stır.
B¨oylece, e˘ger 0 yerine NULL kullanılacak olursa ”g¨ostergeler
tamsayı de˘gildir” kuralı bozulmamı¸s gibi g¨
or¨
unecektir.
Bir g¨ostergenin herhangi bir yeri g¨
ostermesini istemiyorsanız
g = NULL;
atama deyimini kullanın.
NULL’un her tip g¨
osterge ile uyumlu oldu˘
guna dikkat edin.
Bu ¨ozel bir durumdur.
C Programlama
¨
GOSTERGELER
G¨
ostergeler ve Diziler
G¨ostergeler ve Diziler
A¸sa˘gıdaki kodu inceleyelim
int z[N], i;
...
for (i=0; i<N; i++)
*(z+i) = 0;
Buradaki atama bir ¨
onceki kısmın ba¸sında verilenle tamamen
aynıdır.
z ile &z[0] aynı ¸sey oldu˘
gunu daha ¨
once g¨
orm¨
u¸st¨
uk.
Dolayısıyla, *(z+i) ile *(&z[0]+i) aynı ¸seydir.
Yukarıda g¨osterge toplama i¸slemleri ile ilgili anlatılanlara g¨ore,
*(z+i) aynı zamanda *(&z[i]) ile de e¸sde˘
gerdir.
* ile & birbirinin aksi i¸slemleri oldu˘
guna g¨
ore, birbirlerini
g¨ot¨
ur¨
urler. B¨oylece ifade z[i] olur.
C Programlama
¨
GOSTERGELER
G¨
ostergeler ve Diziler
G¨ostergeler ve Diziler
int z[N], i;
...
for (i=0; i<N; i++)
*(z+i) = 0;
Aslında, derleyici z[i] ¸seklindeki bir ifadeyi hemen *(z+i)
¸sekline d¨on¨
u¸st¨
ur¨
ur, yani ilk ¸sekil programcının rahatlı˘gı i¸cin
dilde sa˘glanan bir kısaltma gibi d¨
u¸su
¨n¨
ulebilir.
Hatta z[i] yerine, biraz garip olan, i[z] ifadesini de
kullanabilirsiniz.
C Programlama
¨
GOSTERGELER
G¨
ostergeler ve Diziler
G¨ostergeler ve Diziler
Dizi isimlerinin ger¸cekte g¨
osterge oldu˘
gunu bildi˘ginize g¨ore,
float z[N];
ile
float *g;
arasındaki fark nedir?
g=z
ataması yapıldı˘gı zaman,
g, &z[0], ve z,
kendi aralarında,
g+i, &z[i], ve z+i,
ve
*(g+i), z[i], ve *(z+i)
de, aynı ¸sekilde, kendi aralarında e¸sde˘
gerdir.
C Programlama
¨
GOSTERGELER
G¨
ostergeler ve Diziler
G¨ostergeler ve Diziler
Fakat ¨onemli bir fark var:
z = g;
yazılamaz ¸cu
¨nk¨
u g bir de˘
gi¸sken g¨
osterge, oysa z bir de˘gi¸smez
g¨ostergedir.
De˘gi¸sken tanımlamalarına geri d¨
onersek.
float z[N];
derleyicinin, ana bellekte N float de˘
gi¸sken i¸cin gerekli yer
ayırmasına yol a¸cacaktır. (Bizim sistemimizde 4xN bayt.)
Bu bellek ¨obe˘ginin ba¸slangı¸c adresi z de˘
gi¸smezinin (g¨osterge)
de˘geri olur.
z bir de˘gi¸sken de˘gildir, ¸cu
¨nk¨
u bu (de˘
gi¸smez) adresi saklamak
i¸cin bellekte ayrıca yer ayrılmamı¸stır.
C Programlama
¨
GOSTERGELER
G¨
ostergeler ve Diziler
G¨ostergeler ve Diziler
Di˘ger yandan,
float *g;
bir adres tutacak geni¸slikte bir yerin ayrılmasını sa˘glar. (Bizim
sistemimizde 4 bayt.)
Programın y¨
ur¨
ut¨
ulmesi esnasında, bu g de˘
gi¸skeni de˘gi¸sik
zamanlarda de˘gi¸sik de˘
gerler tutabilir.
Ba¸slangı¸cta ise, ¸simdiye kadar g¨
ord¨
u˘
gu
¨m¨
uz de˘gi¸sken t¨
urleri
i¸cin, de˘geri belirsizdir.
C Programlama
¨
GOSTERGELER
Karakter Dizileri
Karakter Dizileri
C dilinde ¨ozel bir ”karakter dizisi” tipi yoktur.
Ancak karakter dizisi gerektiren durumlar i¸cin bazı kolaylıklar
bulunmaktadır.
Karakterlerden olu¸san normal bir dizi veya bir karakter
g¨ostergesi bir karakter dizisi olarak d¨
u¸su
¨n¨
ulebilir.
#include <stdio.h>
void main (void)
{
char *dd;
dd = ”dunya”;
printf(”Merhaba, %s.\n”, dd);
}
C Programlama
¨
GOSTERGELER
Karakter Dizileri
Karakter Dizileri
printf’in ilk arg¨
umanı bir karakter g¨
ostergesi olmalıdır; ikinci
arg¨
uman da, %s d¨
on¨
u¸su
¨m tanımlamasının gerektirdi˘gi ¸sekilde
bir karakter g¨ostergesidir.
Yukarıdaki atama ifadesinde oldu˘
gu gibi, bir ifade i¸cinde
kullanılan bir karakter dizisi de˘
gi¸smezi bir karakter
g¨ostergesidir ve dizinin ilk karakterine i¸saret eder.
Karakter dizisi, derleyici tarafından, bir tarafta saklanır.
B¨oylece, yukarıdaki atama deyiminde sadece bir g¨osterge
ataması yapılmaktadır; bir karakter dizisi aktarması s¨oz
konusu de˘gildir.
C Programlama
¨
GOSTERGELER
Karakter Dizileri
Karakter Dizileri
E˘ger bir karakter dizisi aktarması yapmak istiyorsak bunu
kendimiz yapmalıyız.
¨ gin,
Orne˘
char d[10];
d = ”bir dizi”;
ge¸cersizdir, ¸cu
¨nk¨
u derleyici g¨
osterge ataması yapmaya
¸calı¸sacaktır.
Ancak ”=” i¸saretinin sol tarafında bir de˘
gi¸smez g¨osterge
bulundu˘gundan, bu olanaksızdır.
Karakterleri tek tek, bir d¨
ong¨
u kullanarak, atamak zorundayız.
C Programlama
¨
GOSTERGELER
Karakter Dizileri
Karakter Dizileri
B¨oyle i¸slemler ¸cok sık kullanıldı˘
gı i¸cin, C k¨
ut¨
uphanesi bazı
karakter dizisi i¸sleme fonksiyonları sa˘
glamaktadır.
¨
Orne˘gin,
strcpy(d, ”bir dizi”);
bizim i¸simizi g¨orecektir.
Bu fonksiyon, ikinci arg¨
uman olarak ge¸cirilen adresteki b¨
ut¨
un
karakterleri, en sonda gelen bo¸s karakteri (\0) ile birlikte, d
tarafından g¨osterilen yere aktaracaktır.
Bu fonksiyon, hedef dizinin bu kadar ¸cok karakteri alacak
geni¸slikte olup olmadı˘
gını kontrol etmez.
C Programlama
¨
GOSTERGELER
Karakter Dizileri
Karakter Dizileri
Benzer bir durum karakter dizileri kar¸sıla¸stırması yaparken
ortaya c¸ıkar.
if (s==”Bu dizi”) ...
testi her zaman yanlı¸s sonucunu verecektir.
Bunun nedeni g¨osterge e¸sitli˘
gini test etmemizdir.
s ya bir g¨osterge yada bir dizi ismi olabilir; de˘gi¸smez karakter
dizisi ise onu saklamak i¸cin kullanılan bellek ¨
obe˘ginin ba¸sına
i¸saret eden bir g¨ostergedir.
Do˘gal olarak, bunlar farklı adreslerdir, b¨
oylece bu test hi¸cbir
zaman ”do˘gru” sonucunu vermeyecektir.
C Programlama
¨
GOSTERGELER
Karakter Dizileri
Karakter Dizileri
Bunun yerine, s1 ve s2 ¸seklinde verilen iki karakter dizisini
kar¸sıla¸stırıp, s¨ozl¨
uk sıralamasına g¨
ore s1’in s2’den k¨
u¸cu
¨k, s2’ye
e¸sit veya s2’den b¨
uy¨
uk olmasına ba˘
glı olarak, sırasıyla
olumsuz bir tamsayı, sıfır veya olumlu bir tamsayı veren
strcmp(s1,s2) fonksiyonunu kullanmalıyız.
C Programlama
¨
GOSTERGELER
Karakter Dizileri
Karakter Dizileri
strcat(d,s) fonksiyonu, s dizisini d’nin arkasına aktarır. d
dizisinin hem eski hem de yeni karakter dizisini kapsayacak
kadar geni¸s olması gerekir.
strlen(s), s karakter dizisinin uzunlu˘
gunu verir; bunu yaparken
en sondaki bo¸s karakteri saymaz.
strchr(s,c), c karakterinin s karakter dizisinin i¸cinde ilk ortaya
¸cıktı˘gı yerin adresini bir karakter g¨
ostergesi olarak d¨ond¨
ur¨
ur; c
dizi i¸cinde yoksa NULL verir.
strrchr(s,c), strchr(s,c) gibidir, sadece tarama i¸slemini sa˘gdan
sola do˘gru yapılır.
Bu fonksiyonların bildirimi string.h ba¸slık dosyasında
bulunmaktadır.
C Programlama
¨
GOSTERGELER
Karakter Dizileri
Karakter Dizileri
C k¨
ut¨
uphanesinde bazı veri d¨
on¨
u¸su
¨m fonksiyonları da mevcuttur.
Bunlardan bazılarının bildirimi stdlib.h ba¸slık dosyasında bulunmaktadır ve a¸sa˘gıda a¸cıklanmı¸stır.
double atof(char *): karakter dizisi arg¨
umanını ¸cift duyarlıklı
kayan noktalı sayıya c¸evirir; hata durumunda 0.0 d¨ond¨
ur¨
ur.
int atoi(char *): karakter dizisi arg¨
umanını tamsayıya ¸cevirir;
hata durumunda 0 d¨
ond¨
ur¨
ur.
long atol(char *): karakter dizisi arg¨
umanını uzun tamsayıya
¸cevirir; hata durumunda 0L d¨
ond¨
ur¨
ur.
C Programlama
¨
GOSTERGELER
Karakter Dizileri
Karakter Dizileri
char * itoa(int, char *, int): ilk tamsayı arg¨
umanını karakter
dizisine ¸cevirir, sonucu ikinci arg¨
uman olarak verilen adrese
koyar; u
¨¸cu
¨nc¨
u arg¨
uman tabanı belirtir.
char * ltoa(long, char *, int): ilk uzun tamsayı arg¨
umanını
karakter dizisine ¸cevirir, sonucu ikinci arg¨
uman olarak verilen
adrese koyar; u
¨¸cu
¨nc¨
u arg¨
uman tabanı belirtir.
int toupper(int) ve int tolower(int): sırasıyla karakter
arg¨
umanının b¨
uy¨
uk harf ve k¨
u¸cu
¨k harf kar¸sılı˘
gını d¨ond¨
ur¨
ur.
C Programlama
¨
GOSTERGELER
Bitsel ˙I¸sle¸cler
Bitsel ˙I¸sle¸cler
Bitsel i¸sle¸cler, de˘gi¸skenler u
¨zerinde bit d¨
uzeyin i¸slem
yapılmasını sa˘glarlar.
Bire t¨
umler ve atama i¸sle¸cleri sa˘
gdan sola do˘
gru, di˘gerleri
soldan sa˘ga do˘gru birle¸sirler.
Bu kısımda anlatılan t¨
um i¸sle¸cler sadece (¸ce¸sitli boylarda
olabilen) tamsayı i¸slenenleri kabul ederler.
Atama ile ilgili olanlar hari¸c, e˘
ger i¸slenenler de˘gi¸smez ifadeler
ise, de˘gi¸smez ifadeler olu¸stururlar.
C Programlama
¨
GOSTERGELER
Bitsel ˙I¸sle¸cler
Bitsel ˙I¸sle¸cler
Bu i¸sle¸clerin isimleri ve kullanılan simgeler ¸s¨
oyledir:
˙sle¸c
I¸
˜
<<
>>
&
ˆ
|
<<=
>>=
&=
ˆ=
|=
˙
Isim
bire t¨
umler
sola kaydırma
sa˘
ga kaydırma
bitsel VE
bitsel dı¸slayan VEYA
bitsel VEYA
sol kaydırma ve atama
sa˘
ga kaydırma ve atama
bitsel VE ve atama
bitsel XOR ve atama
bitsel VEYA ve atama
C Programlama
¨
GOSTERGELER
Bitsel ˙I¸sle¸cler
Bitsel ˙I¸sle¸cler
Do˘
gruluk Tablosu
y
0
0
1
1
z
0
1
0
1
˜y
1
1
0
0
y&z
0
0
0
1
yˆz
0
1
1
0
y|z
0
1
1
1
C Programlama
¨
GOSTERGELER
Bitsel ˙I¸sle¸cler
Bire T¨umler ˙I¸sleci ˜
”˜” i¸sleci, i¸sleneninin 1 olan bitlerini 0’a, 0 olan bitlerini de
1’e ¸cevirir.
Sonucun tipi i¸slenenin tipiyle aynıdır.
C Programlama
¨
GOSTERGELER
Bitsel ˙I¸sle¸cler
Kaydırma ˙I¸sle¸cleri <<ve >>
Bir kaydırma ifadesi
ifade 1 <<ifade 2
veya
ifade 1 >>ifade 2
¸seklindedir.
Normalde ifade 1 bir de˘
gi¸sken veya dizi elemanıdır.
”<<” i¸sleci durumunda, tip d¨
on¨
u¸su
¨mlerinden sonra, ifade 2
int’e ¸cevrilir ve ilk i¸slenenin bitleri ifade 2’nin de˘geri kadar
sola kaydırılır.
˙slenenin solundan ”d¨
I¸
u¸sen” bitler kaybedilir.
Sola kayan bitlerden arta kalan sa˘
gdaki bo¸s yerler sıfırla
doldurulur.
Sonucun tipi soldaki i¸slenenin tipidir.
C Programlama
¨
GOSTERGELER
Bitsel ˙I¸sle¸cler
Kaydırma ˙I¸sle¸cleri <<ve >>
”>>” i¸sleci yukarıda anlatılanların sa˘
ga do˘
gru olan ¸seklini
yerine getirir, tek bir farkla: E˘
ger soldaki ifade signed (i¸saretli)
ise bo¸s kalan yerler, 0 yerine, i¸saret bitiyle doldurulabilir.
Buna aritmetik kaydırma denir ve sistemimiz bunu yapar.
E˘ger ilk ifade unsigned (i¸saretsiz) ise solda bo¸salan bitlerin
sıfırla doldurulaca˘
gı garanti edilir ve bir mantıksal kaydırma
s¨oz konusudur.
C Programlama
¨
GOSTERGELER
Bitsel ˙I¸sle¸cler
Bitsel VE ˙I¸sleci &
˙Ikili & i¸sleci i¸slenenlerinin bitlerinin VE’sini verir.
Yani e˘ger her iki i¸slenenin i’inci bitleri 1 ise, sonucun i’inci biti
de 1 olur, aksi takdirde 0’dır.
(a & b) & c
ve
a & (b & c)
aynı de˘gerlere sahiptirler (yani & i¸slecinin birle¸sme ¨ozelli˘gi
vardır).
C bu ger¸ce˘gi kullanır ve derleyici, daha verimli olaca˘gı
gerek¸cesiyle, parantez i¸cine alınmı¸s olsa dahi, b¨oyle ifadeleri
(yani, * ve + gibi birle¸sme ve de˘
gi¸sme ¨
ozelli˘
gi g¨osteren
i¸sle¸cleri i¸ceren ifadeleri) istedi˘
gi ¸sekilde yeniden d¨
uzenleyebilir.
C Programlama
¨
GOSTERGELER
Bitsel ˙I¸sle¸cler
Bitsel Dı¸slayan VEYA ˙I¸sleci ˆ
”ˆ” i¸sleci, i¸slenenlerinin XOR c¸ıktısını verir.
Yani e˘ger i¸slenenlerin i’inci bitleri farklı ise, sonucun i’inci biti
1 olur, aksi takdirde 0’dır.
”ˆ” birle¸sme ¨ozelli˘
gi g¨
osteren bir i¸sle¸ctir ve bu i¸sleci i¸ceren
ifadeler, ¨onceki altkısımda anlatıldı˘
gı gibi, yeniden
d¨
uzenlenebilir.
C Programlama
¨
GOSTERGELER
Bitsel ˙I¸sle¸cler
Bitsel VEYA ˙I¸sleci j
”|” i¸sleci, i¸slenenlerinin kapsayan VEYAsını verir.
Yani e˘ger her iki i¸slenenin i’inci bitleri 0 ise, sonucun i’inci biti
de 0 olur, aksi takdirde 1’dir.
”|” da birle¸sme ¨ozelli˘
gi g¨
osteren bir i¸sle¸ctir ve yeniden
d¨
uzenleme s¨oz konusu olabilir.
C Programlama
¨
GOSTERGELER
Bitsel ˙I¸sle¸cler
Atama ˙I¸sle¸cleri <<=, >>=, &=, ˆ= ve ||=
Yukarıda anlatılan i¸sle¸cler belirli ifadeler olu¸sturmalarına
ra˘gmen, i¸slenenlerinin de˘
gerlerini de˘
gi¸stirmezler.
Atama i¸sle¸cleri ise i¸slemin sonucunu soldaki i¸slenenlerine
aktarırlar.
Her bir ikili bitsel i¸slecin kar¸sılı˘
gında bir atama i¸sleci
mevcuttur, << i¸cin <<=, >> i¸cin >>=, & i¸cin &=, ˆ i¸cin
ˆ= ve | i¸cin |=.
Bu i¸sle¸clerin i¸slevselli˘
gi di˘
ger atama i¸sle¸clerine benzer.
C Programlama
¨
GOSTERGELER
Bitsel ˙I¸sle¸cler
¨
Bir Ornek-Sayı
Paketleme
Bitsel i¸sle¸clerin kullanımını g¨
ostermek i¸cin, u
¨c¸ sayıyı bir tamsayıya
”paketleyen”, daha sonra ise ”a¸can” a¸sa˘
gıdaki programı inceleyelim.
¨
Ornek
program 6
C Programlama
¨
GOSTERGELER
˙I¸sle¸c Onceli˘
¨
gi ve Birle¸sme
˙I¸sle¸c Onceli˘
¨
gi ve Birle¸sme
˙I¸sle¸c ¨onceli˘gi ve birle¸sme ¸cizelgesi a¸sa˘
gıda g¨
osterilmi¸stir.
Figure: ˙I¸sle¸c ¨
onceli˘
gi ve birle¸sme
C Programlama
¨
GOSTERGELER
˙I¸sle¸c Onceli˘
¨
gi ve Birle¸sme
˙I¸sle¸c Onceli˘
¨
gi ve Birle¸sme
Bu ¸cizelge, C dilindeki b¨
ut¨
un i¸sle¸cleri, azalan ¨oncelik sıralarına
g¨ore liste halinde vermektedir.
Aynı satırda verilmi¸s olan i¸sle¸cler aynı ¨
onceli˘
ge sahiptirler.
E˘ger aynı ¨onceli˘ge sahip iki i¸slecimiz varsa, o zaman ¸cizelgenin
sa˘g s¨
utununda g¨osterilen birle¸smeyi kullanırız.
Sa˘ga do˘gru ok (→) soldan sa˘
ga birle¸smeyi ifade eder, ¨orne˘gin
”x/y/z” ile ”(x/y)/z” aynı anlamı ta¸sırlar.
Sola do˘gru ok (←) sa˘
gdan sola birle¸smeyi belirtir, ¨orne˘gin
”x=y=z” ile ”x=(y=z)” e¸sde˘
ger ifadelerdir.
T¨
um tekli i¸sle¸cler, u
¨¸cl¨
u (ko¸sullu) i¸sle¸c ve t¨
um atama i¸sle¸cleri
sa˘gdan sola do˘gru gruplanırlar; geri kalanların soldan sa˘ga
do˘gru birle¸sme ¨ozelli˘
gi vardır.
Download

neler öğrendim sınavları 21