Pointer Dizi Kopyalama

31 Mart 2011 by B.Selçuk ÖKSÜZ
Leave a reply »
WP Greet Box icon
Merhaba! Selcukoksuz.com adresine hoş geldiniz. Eğer yeni iseniz ve içeriğimizi takip etmek isterseniz RSS Abonesi Olabilirsiniz.
Mailinize onay mesajı gönderilecektir. Cevaplamayı unutmayınız.

Bir önce ki ponter konumuzdan sonra, konuyu ile biraz daha bütünleştirerek örnek uygulamalara yer vereceğiz. Çünkü pointerlar da ki ana amaç ile kompleks kullanımlara müsade etmesidir.

Bu dersimiz de notasyonlar ile alakalı biraz bilgi vereceğiz. İki diziyi birbirine kopyalamak ile alakalı kavramlarını inceleyip uygulamalarına örnek vereceğiz. Bunun için birden fazla yöntem mevcut. Bu yöntemler aşağıda ki uygulamalarda gösterilmiştir.

Bu arada tüm uygulamalar aynı işlemi yapmaktadır. Ama yöntem farklıdır. Uygulamalarda iki dizimiz mevcut. İlk dizimizin değerleri girilmiş bir durumda, ikinci dizimiz ise boş durumda. İşlemlerimizi gerçekleştirip ikinci dizimizi ekrana yazdırıyoruz.

Uygulama: İşaretçiler ile dizi kopyalama

Amaç: Dizi offset notasyonu

Dil: C++

Program: DevC++

Kodlar:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main()
{

    char dizi1[7] = {'d','e','n','e','m','e'};
    char dizi2[7];

    for(int i=0; *(dizi1+i) != '\0'; i++)
        *(dizi2+i) = *(dizi1+i);
        //değişken başına yıldız getirildiği için burada
        //bellek adresleri ataması olmuştur.

    printf("%s",dizi2); 

    printf("\n");
    printf("blog.selcukoksuz.com");
    system("pause");    
}

Bu örnekte değişkenlerin bellek adresleri bir birine eşitlenerek, döngü içerisinde başlangıç işaretçisinden i kadar uzaklıkta ki değerler bir birine eşitlenmiştir.

Uygulama: İşaretçiler ile dizi kopyalama

Amaç: Pointer indis notasyonu

Dil: C++

Program: DevC++

Kodlar:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main()
{    
    char dizi1[7] = {'d','e','n','e','m','e'};
    char dizi2[7];

    char *sptr1, *sptr2;
    sptr1 = dizi1;//Dizi değerlerini pointer ataması yaparken & işareti kullanılmaz
    sptr2 = dizi2;

    for(int i=0;sptr1[i] != '\0'; i++)
         sptr2[i] = sptr1[i];         

    printf("%s",dizi2);          

    printf("\n");
    printf("blog.selcukoksuz.com");
    system("pause");    
}

Yukarıda ki uygulamada 11. satırda pointer aramasında & işaeti kullanılmamıştır. Dizi değerleri direk bellekteki adres değerlerini ifade ederken ekrana yazdırdığımız da direk taşıdıkları değeri görürüz. Yani C dili bize bu dönüşümü göstermeksizin direk bellek değerini ekrana yazdırır. Ama atama yapılırken & işareti kullanılmadan atama yapılır. Dizi olmayan her hangi bir değeri pointer a atarken başında & simgesini kullanmak durumundaydı.

Uygulama: İşaretçiler ile dizi kopyalama

Amaç: Pointer offset notasyonu

Dil: C++

Program: DevC++

Kodlar:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main()
{    
    char dizi1[7] = {'d','e','n','e','m','e'};
    char dizi2[7];

    char *sptr1, *sptr2;
    sptr1 = dizi1;
    sptr2 = dizi2;
    int i;
    for(i=0; *(sptr1+i) !='\0'; i++)
        *(sptr2+i) = *(sptr1+i);

    printf("%s",dizi2);          

    printf("\n");
    printf("blog.selcukoksuz.com");
    system("pause");    
}

Yukarıda ki uygulama da for döngüsünde ve içerisinde pointer değeri önünde * simgesi kullanılarak değişkenlerin taşıdıkları değerler(bellek adresleri değil) ile işlem yapılmıştır. Bu arada hala kopyalama mantığımız başlangıç pointer değerinden i kadar uzaklıkta ki değerleri bir birine eşitleyerek iki diziyi bir birine kopyalıyoruz.

Uygulama: İşaretçiler ile dizi kopyalama

Amaç: Pointer kaydırarak

Dil: C++

Program: DevC++

Kodlar:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main()
{    
    char dizi1[7] = {'d','e','n','e','m','e'};
    char dizi2[7];

    char *sptr1, *sptr2;
    sptr2=dizi2;

    //1. FOR YAPISI
    for(sptr1=dizi1;*sptr1 !='\0';sptr1++) 
    {
        *sptr2 = *sptr1;//içerikler atandı
        sptr2++;         //adres ilerledi            
    }

    printf("%s",dizi2);          

    printf("\n");
    system("pause");    
}

Yukarıda ki örnekte ilk örneklerden farklı olarak başlangıç indisinden i kadar uzaklıkta ki değerleri bir birine kopyalamıyoruz da pointer değerini bir sonraki bellek adresine taşıyarak o değeri kopyalıyoruz.

Uygulama: Gösterici Diziler

Amaç: Pointer ile random dizi değeri içeriği yazdırmak

Dil: C++

Program: DevC++

Kodlar:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>//Random için eklendi
#define N 10
int main()
{   
    char *isimler[N]={"ali","ahmet","mehmet","ayse","fatma","hayriye","deniz","mustafa","selcuk","serdar"};
    int i,rastgeleindis;

    printf("%p \n", isimler[0]);
    printf("%s \n", isimler[0]);

    for(i=0; i<N; i++)
       printf("Adresi %p kelime %s \n",isimler[i], isimler[i]);

    printf("\n\nKarisik dizi\n");
    srand(time(NULL));
    for(i=0;i<N;i++)
    {
          rastgeleindis = rand()%N;          
          if(isimler[rastgeleindis] == "")
              rastgeleindis = rand()%N;
              //Aynı değerin gelmemesi için
          else
          {                      
              printf("Adresi %p kelime %s \n",isimler[rastgeleindis],isimler[rastgeleindis]);
              isimler[rastgeleindis] = ""; 
          }
    }
    printf("\n\t\t\t\t\tblog.selcukoksuz.com");
    getch();
}

Yukarıda ki uygulamanın çıktısı aşağıda ki gibidir;

00403000
ali
Adresi 00403000 kelime ali
Adresi 00403004 kelime ahmet
Adresi 0040300A kelime mehmet
Adresi 00403011 kelime ayse
Adresi 00403016 kelime fatma
Adresi 0040301C kelime hayriye
Adresi 00403024 kelime deniz
Adresi 0040302A kelime mustafa
Adresi 00403032 kelime selcuk
Adresi 00403039 kelime serdar

Karisik dizi
Adresi 00403016 kelime fatma
Adresi 0040301C kelime hayriye
Adresi 00403011 kelime ayse
Adresi 00403000 kelime ali
Adresi 00403024 kelime deniz
Adresi 0040302A kelime mustafa
Adresi 00403004 kelime ahmet
Adresi 00403032 kelime selcuk

                                        blog.selcukoksuz.com

Yazar Hakkında

Bilgisayarla yaşamayı bir tarz olarak benimsemiş, teknoloji ile tamamen içli dışlı bir; web tasarımcı, yazılımcı, donanımcı, blog yazarı ve bilgisayar mühendisidir.
B.Selçuk ÖKSÜZ
B.Selçuk ÖKSÜZ kullanıcısının tüm yazıları.
Advertisement

Bu Yazıyı Beğendiniz Mi?

0

Bir Cevap Yazın

Sizin Yorumunuz Nedir?

%d blogcu bunu beğendi:
Gizlilik Hakları