programlama dilleri 1 - bilecik Şeyh edebali...
TRANSCRIPT
Programlama Dilleri 1
Ders 8: Gösterici Dizileri
Gösterici dizileri
Programlama Dilleri 1 2
Elemanları göstericilerden oluşan dizilere
“gösterici dizileri” (pointer arrays) denir.
<tipi> * dizi ismi [dizi_uzunluğu];
char *ad[10];
int *eleman[50];
float *fiyat[10];
Örnek 1 #include <stdio.h>
#include <conio.h>
#define boyut 3
void main(){
int dizi[] = {10, 100, 200}; //normal dizi
int *ptr[boyut], i; //gösterici dizisi
for (i=0; i<boyut; i++)
printf("dizi[%d]=%d\n",i,dizi[i]);
for (i=0; i<boyut; i++)
ptr[i] = &dizi[i]; //adres atama
for (i=0; i<boyut; i++)
printf("dizi[%d]=%d\n",i,*ptr[i]);
}
Programlama Dilleri 1 3
Programlama Dilleri 1 4
char isimler[5][20]={"veli", "ayşe", "ela", "murat", "selma"};
for (int i=0; i<5; i++)
printf("isimler[%d]=%s\n",i,isimler[i]);
Programlama Dilleri 1 5
char *isimler[] = {"veli", "ayşe", "ela", "murat", "selma"};
for (int i=0; i<5; i++)
printf("isimler[%d]=%s\n",i,isimler[i]);
Gösterici dizileri
Derleyici bir gösterici dizisi tanımlaması
ile karşılaşınca diğer dizilerde yaptığı
gibi, bellekte belirtilen sayıda göstericiyi
tutabilecek kadar ardışık yer tahsis eder.
char *s[5]; bildirimi ile derleyici, s
dizisinin 5 elemanlı ve her elemanın char
tipinde bir gösterici olduğunu anlar.
Programlama Dilleri 1 6
Gösterici dizileri
Dinamik olarak tahsis edilen alanlar,
gerektiği zaman yine bir döngü
yardımıyla serbest bırakılabilir:
...
for (k = 0; k < 10; ++k)
free(s[k]);
...
Programlama Dilleri 1 7
Gösterici dizileri
Bazı durumlarda, bir gösterici dizisinin son
elemanına özellikle NULL adresi atanır.
Böyle bir gösterici dizisi, boyutu
belirtilmeden işlenebilir.
Programlama Dilleri 1 8
Örnek 2
#include<stdio.h>
#include<conio.h>
void main()
{
char *isimler[] = {"ali","veli","gul","ayse","murat"};
int k;
for (k = 0; isimler[k]!=NULL; ++k){
puts(isimler[k]); }
getch();
}
Programlama Dilleri 1 9
Gösterici dizilerine ilk değer verilmesi
Normal dizilere ilk değer nasıl veriliyorsa
gösterici dizilerine de ilk değer aynı
biçimde verilir. Ancak dikkatli başlangıç
değeri vermek gerekir !!!
int *p[]={ (int*) 0x12FF50,
(int*) 0x12FF54,
(int*) 0x12FF58 };
Programlama Dilleri 1 10
Örnek 3 #include <stdio.h>
#include <conio.h>
#define boyut 3
main(){
int dizi1[ ] = {10, 100, 200};
int dizi2[ ] = {1, 5, 9};
int dizi3[ ] = {0, -42, 536};
int *ptr[boyut], i; //gösterici dizisi
ptr[0] = dizi1; //adres atama
ptr[1] = dizi2;
ptr[2] = dizi3;
for (i=0; i<boyut; i++)
printf("%d\n",*ptr[i]);
//ekrana ne basar ???
}
Programlama Dilleri 1 11
10 1 0
Örnek 4 #include <stdio.h>
#include <conio.h>
#define boyut 3
main(){
int dizi1[ ] = {10, 100, 200};
int dizi2[ ] = {1, 5, 9};
int dizi3[ ] = {0, -42, 536};
int *ptr[boyut], i; //gösterici dizisi
ptr[0] = dizi1; //adres atama
ptr[1] = dizi2;
ptr[2] = dizi3;
for (i=0; i<boyut; i++)
printf("%d\n",*ptr[i]+1);
//ekrana ne basar ???
}
Programlama Dilleri 1 12
11 2 1
Örnek 5 #include <stdio.h>
#include <conio.h>
#define boyut 3
main(){
int dizi1[ ] = {10, 100, 200};
int dizi2[ ] = {1, 5, 9};
int dizi3[ ] = {0, -42, 536};
int *ptr[boyut], i; //gösterici dizisi
ptr[0] = dizi1; //adres atama
ptr[1] = dizi2;
ptr[2] = dizi3;
for (i=0; i<boyut; i++)
printf("%d\n",*(ptr[i]+1));
//ekrana ne basar ???
}
Programlama Dilleri 1 13
100 5 -42
Örnek 6 #include <stdio.h>
#include <conio.h>
#define boyut 3
main(){
int dizi1[ ] = {10, 100, 200};
int dizi2[ ] = {1, 5, 9};
int dizi3[ ] = {0, -42, 536};
int *ptr[boyut], i; //gösterici dizisi
ptr[0] = dizi1; //adres atama
ptr[1] = dizi2;
ptr[2] = dizi3;
for (i=0; i<boyut; i++)
printf("%d\n",*(ptr[i]+1)+1);
//ekrana ne basar ???
}
Programlama Dilleri 1 14
101 6 -41
Örnek 7 #include <stdio.h>
#include <conio.h>
#define boyut 3
main(){
int dizi1[ ] = {10, 100, 200};
int dizi2[ ] = {1, 5, 9};
int dizi3[ ] = {0, -42, 536};
int *ptr[boyut], i; //gösterici dizisi
ptr[0] = dizi1; //adres atama
ptr[1] = dizi2;
ptr[2] = dizi3;
for (i=0; i<boyut; i++)
printf("%d\n",*(*(ptr+i)+2));
//ekrana ne basar ???
}
Programlama Dilleri 1 15
200 9 536
Örnek 8 #include <stdio.h>
#include <conio.h>
#define boyut 3
main(){
int dizi1[ ] = {10, 100, 200};
int dizi2[ ] = {1, 5, 9};
int dizi3[ ] = {0, -42, 536};
int *ptr[boyut], i; //gösterici dizisi
ptr[0] = dizi1; //adres atama
ptr[1] = dizi2;
ptr[2] = dizi3;
for (i=0; i<boyut; i++)
printf("%d\n",*(*(ptr+i)+2)-i);
//ekrana ne basar ???
}
Programlama Dilleri 1 16
200 8 534
char tipinde gösterici dizileri
char türden bir gösterici dizisinin her bir
elemanı bir yazıyı göstermektedir.
char *yaz[]={"Haziran","Temmuz","Ağustos"};
Uygulamalarda en sık görülen gösterici
dizileri char türden olan gösterici dizilerdir.
Programlama Dilleri 1 17
char *gunler[]={"Pazartesi","Salı", "Carşamba",
"Persembe","Cuma","Cumartesi","Pazar"};
Programlama Dilleri 1 18
char tipinde gösterici dizileri
Bu tip dizilerin en çok kullanılma nedeni; program içinde sık kullanılacak yazıların her defasında yazılması yerine bir gösterici dizisinin elemanlarında saklamaktır.
char *hata[ ] =
{ "Bellek yetersiz",
"Hatalı şifre",
"Dosya bulunamadı",
"Sürücü hazır değil",
"Belirlenemeyen hata"};
Programlama Dilleri 1 19
Gösterici dizileri
Gösterici dizileri tıpkı diğer diziler gibi, yerel veya
global olabilir. Dizinin global olması durumunda,
dizi tanımlandığında dizi elemanlarının tümünde 0
değerleri bulunur.
Yerel bir gösterici dizisinin içinde ise çöp değerler
(rastgele adres değerleri) bulunur.
Programlama Dilleri 1 20
Örnek 9 char *pnames[] = {"Muhittin", "Mufit", "Serkan", "Kaan",
"Izzet", "Muzaffer", "Umit", "Sami", "Uygar", "Kayhan",
"Yakup", "Mert", "Cetin", "Ilknur", "Gokhan", "Salih",
"Irem", "Korhan", "Isin", "Berk", "Tacettin", "Duygu",
"Figen", "Funda", "Fuat", "Arda","Muhsin", "Guray",
"Necati", "Kadriye", "Gurbuz", "Hamide", "Volkan",
"Selami", "Esra", "Cumhur", "Can", "Aleyna", "Salih",
"Kamuran", "Ferhan", "Furuze", "Sukufe", "Sidre",
"Cahit", "Sercan", "Jale", "Bilge", "Tijen", "Tufan",
"Zeliha", "Cevdet", "Burak", "Ufuk", "Zarife",
"Bengisu", "Melda", "Zafer", "Yelda", "Didar", "Hande",
"Cumali", "Dilek", "Kemal", "Hasan", "Ismail", "Fatma",
"Burcu", "Siyami", "Busra", "Gizem", "Ramize", "Sezai",
"Polat", "Melike", "Umut", "Serencan", "Uzeyir",
"Kamile", "Deniz", "Veysel", "Emrehan", "Gulcan",
"Ender", "Furkan", "Veli", "Muhtesem", "Necmettin",
"Osman", "Perihan", "Didem", "Tunc", "Irmak","Petek",
"Sebahat", "Halime", "Mahir", "Leyla", "Eda", "Ali",
"Ibrahim", "Berivan"};
/*YUKARIDAKİ pnames isimli GÖSTERİCİ DİZİSİNİ KULLANARAK
SORULARI YANITLAYINIZ*/
Programlama Dilleri 1 21
Örnek 9a /*Dizinin elemanlarının göstermekte
olduğu isimleri ekrana yazdıran
kod...*/
int i;
for(i=0;pnames[i]!='\0';i++)
printf("%s\n",*(pnames+i));
Programlama Dilleri 1 22
Muhittin Mufit
Serkan
…
Örnek 9b /*2.Dizinin elemanlarının göstermekte
olduğu isimlerin ilk harfini ekrana
yazdıran kod...*/
int i;
for(i=0;pnames[i]!='\0';i++)
printf("%c\n",**(pnames+i));
//printf("%c ",*pnames[i]);
Programlama Dilleri 1 23
M M
S
…
Örnek 9c /*3.Dizinin elemanlarının göstermekte
olduğu isimlerin son harfini ekrana
yazdıran kod...*/
int i,j;
for(i=0;pnames[i]!='\0';i++){
for(j=0;*(pnames[i]+j)!='\0';j++);
printf("%c\n",*(pnames[i]+j-1));
}
Programlama Dilleri 1 24
n t
n
…
Örnek 9d /*4.Kullanıcının klavyeden girdiği bir harf
karakteri ile dizinin elemanlarının
göstermekte olduğu isimlerden, içinde bu harf
olanları ekrana yazdıran kod...(küçük/büyük
harf olabilir) */
int i,j;
char ch;
printf("\nbir harf giriniz: ");
scanf("%c",&ch);
for(i=0;pnames[i]!='\0';i++)
for(j=0;*(pnames[i]+j)!='\0';j++)
if(pnames[i][j] == ch || pnames[i][j] == ch-
'A'+'a' || pnames[i][j] == ch-'a'+'A‘) {
printf("%s,",pnames[i]);
break; }
Programlama Dilleri 1 25
Örnek 9e /*5.Kullanıcı klavyeden bir yazı
karakteri girsin. Dizinin
elemanlarının göstermekte olduğu
isimlerden, içinde bu yazı olanları
ekrana yazdıran kod...(küçük/büyük
harf olabilir)*/
int i,j,k;
char *cp;
printf("\nbir yazi giriniz: ");
scanf("%s",cp);
/***/
Programlama Dilleri 1 26
Örnek 9f /*6.Dizinin gösterdiği yazıların
uzunluklarının aritmetik ortalamasını
ekrana yazdıran kod...*/
int toplam=0;
float ortalama;
/***/
ortalama=(float)toplam/i;
printf("\nortalama=%2.3f'dir.",ortalama);
Programlama Dilleri 1 27