noimage

İçeriği Paylaş:

İşaretçiler ve Diziler

1.3. İşaretçiler ve Dizilerİşarteçiler üzerinde geçerli aritmetik işlemler yardımıyla, dizilereişaretçi değişkenler ile erişmek mümkündür.#include <stdio.h>int main(){int i[10], j;int *iptr;for (j=0; j<10; j++)i[j]=j;/* Dizinin başlangıç adresine erişmek için ilkelemanın adresi kullanılabilir &i[0] veya doğrudani */iptr = i;for (j=0; j<10; j++) {printf(“%d “, *iptr);iptr++;}printf(“”);/* iptr artık dizinin başını göstermez */iptr = i;for (j=0; j<10; j++)printf(“%d “, *(iptr+j));printf(“”);/* iptr hala dizinin başını gösterir */getch();return 0;}Örnek : İşaretçi ve dizgi kullanımı.#include <stdio.h>#include <conio.h>int main(){char *a=”1234567890″;char b[11];char *p1, *p2;printf(“%s”, a);p1 = a;p2 = b;while (*p1 != ‘\0’) {*p2 = *p1;p1++;p2++;}printf(“%s”, b);getch();return 0;}1.4. İşlevleri Referans Yoluyla ÇağırmaŞu ana yazdığımız işlevlerde gönderilen parametrelerin (dizilerhariç) değerlerinin değiştirilmesi mümkün değil idi. İşlev çağırıldığızaman parametrelerin bir kopyası çıkartılıp işleve gönderiliyordu. Birişlevin birden fazla değer gönderebilmesi için işaretçilere gereksinimizvardır.void arttir(int);main(){int i;i = 5;printf(“öncesi %d”, i);arttir(i);printf(“sonrası %d”, i);getch();}void arttir(int k){k++;}Çıktı :öncesi 5sonrası 5Gönderilen parametrenin kopyası işleve gönderildiği için işleviçerisinde yapılan değişiklikler işlevin çağırıldığı yeri etkilemez. Eğerparametredeki değişikliklerin işlevin çağırıldığı yerde de geçerliolmasını istiyorsak işleve parametrenin adresini göndermek gerekir.void arttir(int*);main(){int i;i = 5;printf(“öncesi %d”, i);arttir(&i);printf(“sonrası %d”, i);getch();}void arttir(int *k){(*k)++;}Çıktı :öncesi 5sonrası 6Örnek : İşleve gönderilen dizinin işlev içerisinde işaretçi olarakkullanımı.#include <stdio.h>#include <conio.h>#define N 5float ort (int *);main(){int s[N];int i, k;for (i=0; i<N; i++) {s[i] = rand() % 100;printf(ʺ%4dʺ,s[i]);}printf(ʺʺ);getch();}float ort (int *a){int i;float t = 0;for (i=0; i<N; i++)t = t + *(a+i);return t/N;} 1.5. Dinamik Bellek Kullanımıvoid malloc(n): En az n byte uzunluğunda bellekten yer ayırır. İşlevindeğeri>0 ise bloğun bellekteki yeri, NULL yer yok demektir.int *i;i = (int *) malloc(2000) ; 2000 byte yer ayırıp bloğun başlangıç adresini iʹye atar( 1000 elemanlı int dizisi )double *x;x = (double *) malloc(8*2000); 2000 elemanlı double dizisizeof(n) : n ifadesinin/tipinin byte olarak uzunluğunu verir.i = (int *) malloc(1000*sizeof(int)) ; 1000 tane int değer içerecek bellekuzunluğux = (double *) malloc(2000*sizeof(double)); 2000 elemanlı double dizivoid free (void *block) : malloc işlevinin tersi. Block değişkenin tuttuğuyeri boş belleğe gönderir.Örnek : Bir dizinin elemanlarının işaretçi olması.main(){char *aylar[] = {ʺʺ, ʺOcakʺ, ʺŞubatʺ, ʺMartʺ, ʺNisanʺ,ʺMayısʺ, ʺHaziranʺ, ʺTemmuzʺ, ʺAğustosʺ,ʺEylülʺ, ʺEkimʺ, ʺKasımʺ, ʺAralıkʺ};int i;printf(ʺAyın sırasını gir ʺ); scanf(ʺ%dʺ, &i);if (i>0 && i<13)printf(ʺ%sʺ, aylar[i]);getch();}Benzer şekilde tanımlaması her bir elemanı bellekte bir ʹfloatʹ sayıyı gösteren işaretçi olan 100 elemanlı bir dizidir. Örnek : Bir işaretçinin adresini içeren işaretçiler.int main(){int i;int *iptr;int **iptrptr;i = 5;iptr = &i;iptrptr = &iptr;printf(ʺ i ve &i : %d %pʺ, i, &i);printf(ʺ *iptr ve iptr : %d %pʺ, *iptr, iptr);printf(ʺ*iptrptr ve iptrptr : %p %pʺ, *iptrptr, iptrptr);getch();} Çıktı:i ve &i : 5 0028FF18*iptr ve iptr : 5 0028FF18*iptrptr ve iptrptr : 0028FF18 0028FF14 

İçeriği Paylaş:
İlginizi Çekebilir
Yorum Yapılmamış

Henüz Hiç Yorum Yapılmadı..

Yorum Yaz

İşaretçiler ve Diziler

Programlama 2

15/07/2016 | Yorum Yok | 27 | kucukakarsu