Upload
others
View
9
Download
0
Embed Size (px)
Citation preview
7. Hafta – Pointer Dizileri
Dr. Öğr. Üyesi Nesibe YALÇIN
https://nesibeyalcin.wordpress.com/bsm104/
BARTIN ÜNİVERSİTESİ
MÜHENDİSLİK, MİMARLIK VE TASARIM FAKÜLTESİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
2
Pointer Dizileri
― Elemanları pointerlardan oluşan dizilere “pointer (gösterici) dizileri” (array of pointers) denir.
― Derleyici bir pointer dizisi tanımlaması ile karşılaşınca diğer dizilerde yaptığı gibi, bellekte belirtilen sayıda pointerı tutabilecek kadar ardışık yer tahsis eder.
― Değişken türü * Pointer dizisinin ismi [Eleman sayısı]; ― char *s[5];
char * il[81]; int * stok[25]; float *maas [40];
3
Char Tipi Pointer Dizileri
― Uygulamalarda en sık görülen pointer dizileri, char türden olan pointer dizileridir.
― char türden bir pointer dizisinin her bir elemanı bir stringi (karakter dizisini) göstermektedir.
― char * isim[]={"ela","gökçe","burak","ömer"};
― char * kurslar[10] = {"Diksiyon","İngilizce", "Bilgisayar", "Bağlama","Gitar", "Tiyatro","Kişisel Gelişim","Fitness (bayanlar)", "Fitness (baylar)“, "Halk Oyunları",};
4
Char Tipi Pointer Dizileri
― Char tipi pointer dizilerin en çok kullanılma nedeni; program içinde sık kullanılacak yazıları her defasında yazmak yerine bir pointerdizisi içerisinde saklayarak gerektiğinde ulaşmaktır.
char *hata[] = { "Bellek yetersiz", "Hatalı şifre", "Dosya bulunamadı", "Sürücü hazır değil", "Belirlenemeyen hata"};
5
Char Tipi Dizi ve Pointerlar
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main(){
char donem[]="Guz/Bahar Donemi";
printf("%s -> adresi %p\n\n",donem,donem);
char *ptr;
ptr=donem;
// char *ptr="Guz/Bahar Donemi";
for(int i=0;i<strlen(donem);i++)
printf("%c – adresi %p\n",*(ptr+i), (ptr+i));
// printf("%c – adresi %p\n",ptr[i],&ptr[i]);
printf("\n%s -> adresi %p\n\n",ptr,ptr);
getch (); }
6
Char Tipi Diziler
― char dersler[6][20] = {"Programlama","Veritabani", "Elektronik","Matematik","Fizik","Veri Yapilari"};
7
Char Tipi Diziler
― char dersler[6][20] = {"Programlama","Veritabani", "Elektronik","Matematik","Fizik","Veri Yapilari"};
int main(){
char dersler[6][20] = {"Programlama","Veritabani",
"Elektronik","Matematik",
"Fizik","Veri Yapilari"};
for(int i=0;i<6;i++){
for(int j=0;dersler[i][j]!='\0';j++)
printf("%c",dersler[i][j]);
printf("\n"); }
}
8
Char Tipi Diziler
― char dersler[6][20] = {"Programlama","Veritabani", "Elektronik","Matematik","Fizik","Veri Yapilari"};
int main(){
char dersler[6][20] = {"Programlama","Veritabani",
"Elektronik","Matematik",
"Fizik","Veri Yapilari"};
for(int i=0;i<6;i++)
printf("%s\n",dersler[i]);
}
9
Char Tipi Pointer Dizileri
― char *dersler [20] = {"Programlama","Veritabani", "Elektronik","Matematik","Fizik","Veri Yapilari"};
10
Char Tipi Pointer Dizileri
#include <stdio.h>
int main(){
char *donem="Guz/Bahar Donemi";
//char donem[]
puts(donem);
//char dersler[][20]
char *dersler[20] = {"Programlama","Veritabani",
"Elektronik","Matematik",
"Fizik","Veri Yapilari"};
for(int i=0;i<6;i++)
printf("%d- %s\n",i+1,dersler[i]); // dersler[i]=*(dersler+i)
}
11
Pointer Dizileri
#include<stdio.h>
#include<conio.h>
int main()
{
const int boyut=7;
int notlar[boyut]={25,40,5,95,50,65,45};
int toplam=0;
for (int i = 0; i < boyut; i++)
toplam += notlar[i];
float ort=(float)toplam/boyut;
printf("Toplam=%d, Ortalama=%.2f",toplam,ort);
getch();
}
adresi Dizi elemanı
değeri
0x04 notlar[0] 25
0x08 notlar[1] 40
0x0C notlar[2] 5
0x10 notlar[3] 95
0x14 notlar[4] 50
0x18 notlar[5] 65
0x1C notlar[6] 45
12
Pointer Dizileri
#include<stdio.h>
#include<conio.h>
int main(){
const int boyut=7;
int notlar[boyut]={25,40,5,95,50,65,45};
int *ptr[boyut];
for (int i = 0; i < boyut; i++){
ptr[i]=¬lar[i];
printf("%d ",*ptr[i]);
}
}
ptr[0]
ptr[1]
ptr[2]
ptr[3]
ptr[4]
ptr[5]
ptr[6]
adresi Dizi elemanı
değeri
0x04 notlar[0] 25
0x08 notlar[1] 40
0x0C notlar[2] 5
0x10 notlar[3] 95
0x14 notlar[4] 50
0x18 notlar[5] 65
0x1C notlar[6] 45
13
Pointer Dizileri
ptr[0]
ptr[1]
ptr[2]
ptr[3]
ptr[4]
ptr[5]
ptr[6]
adresi Dizi elemanı
değeri
0x04 notlar[0] 25
0x08 notlar[1] 40
0x0C notlar[2] 5
0x10 notlar[3] 95
0x14 notlar[4] 50
0x18 notlar[5] 65
0x1C notlar[6] 45
#include<stdio.h>
#include<conio.h>
float ortalama(int *dizi[],int eleman_sayi)
{
int toplam=0;
for (int i = 0; i < eleman_sayi; i++)
toplam+=*dizi[i];
float ort=(float)toplam/eleman_sayi;
return ort;
}
int main()
{
const int boyut=7;
int notlar[boyut]={25,40,5,95,50,65,45};
int *ptr[boyut];
for (int i = 0; i < boyut; i++)
ptr[i]=¬lar[i];
printf("Ortalama=%.2f",ortalama(ptr,boyut));
getch();
}
14
Pointer Dizileri #include <stdio.h>
int main(){
int dizi[] = {66, 6, 42, 11, 54}; //normal dizi
int *ptr[5], i; //gösterici dizisi
for (i=0; i<5; i++)
printf("dizi[%d]=%d\n",i,dizi[i]);
printf("\n");
for (i=0; i<5; i++){//gösterici dizisine adres atama
ptr[i] = &dizi[i];
printf("dizi[%d]=%d \t adresi:%p \n",i,*ptr[i],ptr[i]);
}
}
15
Pointer Gösteren Pointerlar
― Bir pointer, başka bir pointerın adresini gösterebilir:
int x; int *p1; int **p2; x = 5; p1 = &x; p2 = &p1;
NOT: int ** türünden olan bir pointer değişkene, int * türünden bir pointerın adresi atanır.
16
Pointer Gösteren Pointerlar #include<stdio.h>
int main(){
int x;
int *p1;
int **p2;
x = 5;
p1 = &x;
p2 = &p1;
printf("x degiskeni:%d, adresi:%p\n",x,&x); //&x-->p1
printf("p1 gostericisi:%p, adresi:%p\n",p1,&p1); //&p1-->p2
printf("p2 gostericisi:%p, adresi:%p\n",p2,&p2);
}
17
Pointer Gösteren Pointerlar
*p1=24; **p2=10; *(*p2)=10;
18
Pointer Gösteren Pointerlar #include<stdio.h>
#include<conio.h>
int main(){
double x=-2.1;
double y=0.34;
double *p=NULL;
double **p2=NULL;
printf("x:%.2f, y:%.2f\n",x,y);
p=&x;
*p=2.8;
printf("x:%.2f, y:%.2f\n",x,y);
p2=&p;
printf("x:%.2f, y:%.2f\n",x,y);
*p2=&y;
*p=20;
printf("x:%.2f, y:%.2f\n",x,y);
**p2=6.8;
printf("x:%.2f, y:%.2f\n",x,y);
getch(); }
Ekran çıktısı ????
19
Pointer Gösteren Pointerlar
#include<stdio.h>
#include<conio.h>
#include<string.h>
#define N 6
int main()
{
char *meyveler[N]={"muz","elma","cilek","karpuz","armut","uzum"};
for(int i=0;i<N;i++) //meyve isimleri
printf("%d. %s\n",i+1,*(meyveler+i));
for(int i=0;i<N;i++) //meyve isimlerinin bas harfleri
printf("%c\n",**(meyveler+i));
for(int i=0;i<N;i++) { //meyve isimleri
for(int j=0;j<strlen(*(meyveler+i));j++)
printf("%c",*(*(meyveler+i)+j));
printf("\n");
}
getch();
}
20
Tanımlar Pointer Gösterimi Dizi Gösterimi Açıklama
**ptr *dizi[] Bir pointer dizisi
*ptr dizi[0] Dizideki ilk eleman, dizideki ilk pointerın adresi ya da bir string dizisi için ilk string
*(ptr+0) dizi[0]
*(ptr+i) dizi[i] Dizideki (i+1). eleman, dizideki ikinci pointerın adresi ya da bir string dizisi için ikinci string
**ptr dizi[0][0] Dizideki ilk eleman, dizideki ilk pointerın ilk elemanı ya da dizideki ilk stringin ilk karakteri
**(ptr+i) dizi[i][0] Dizinin i.satırdaki ilk elemanı, dizideki i. pointerın ilk elemanı ya da i. stringin ilk karakteri
*(*(ptr+i)) dizi[i][0]
*(*(ptr+a)+b) dizi[a][b] Dizideki a pointerının b e lemanı; dizinin a satırı b sütunundaki eleman
**(ptr+a)+b dizi[a][0]+b İstediğimiz kullanımlardan biri değil !!
21
Dipnot
― Dizinin ilk elemanının adresi ya da dizinin ismi dizinin başlangıç adresini verir.
dizi ↔ &dizi[0];
― Bir değişkenin adresi, değişkenin adının önüne & operatörü getirilerek öğrenilir ve bir pointerı yardımıyla tutulabilir.
― Bir pointerın gösterdiği adresteki değer, pointer adının önüne * operatörü getirilerek öğrenilebilir.
22
Dipnot
― Fonksiyonun ismi fonksiyonun adresini verir. Fonksiyonun adresini tutacak pointer, fonksiyon ile aynı dönüş tipine ve parametre tanımlamalarına sahip olmalıdır.
dönüş_tipi (* pointer_adı)(parametreler) pointer_adı = fonksiyon_adı;
― int sayi; int *ptr1=&sayi; int * ptr2=&ptr1;
― **ptr2 = *ptr1 = sayi *ptr2 = ptr = &sayi ptr2 = &ptr1