Göstericiler (Pointers)



Benzer belgeler
Pointer Kavramı. Veri Yapıları

Özyineleme (Recursion)

BLM 112- Programlama Dilleri II. Hafta 4 İşaretçiler (Pointers)

8. İŞARETCİLER (POINTERS)

Pointers (İşaretçiler)

Yrd. Doç. Dr. Caner ÖZCAN

ALGORİTMA VE PROGRAMLAMA II

ALGORİTMA VE PROGRAMLAMA II

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

HSancak Nesne Tabanlı Programlama I Ders Notları

Yrd. Doç. Dr. Caner ÖZCAN

Temel Bilgisayar Bilimleri Ders Notu #4-2. kısım

FONKSİYONLAR. Gerçek hayattaki problemlerin çözümü için geliştirilen programlar çok büyük boyutlardadır.

Diziler (Arrays) Çok Boyutlu Diziler

sayi=3 harf=a reelsayi=8.72 Bellek durumu 5. İşaretç iler (pointers)

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Yrd. Doç. Dr. Caner ÖZCAN

DİZİLER-KATARLAR ALGORİTMA VE PROGRAMLAMA II

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

Algoritma Geliştirme ve Veri Yapıları 9 Ağaç Veri Modeli ve Uygulaması. Mustafa Kemal Üniversitesi

3.1 Pointer in Yararları

Görsel Programlama DERS 04. Görsel Programlama - Ders04/ 1

Konular. Hafta 5 Veri Tipleri (Devam) BLG339 PROGRAMLAMA DİLLERİ KAVRAMI

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Yrd. Doç. Dr. Caner ÖZCAN

Örnek: İki fonksiyondan oluşan bir program. Fonksiyon Tanımı

C++ Göstericiler (Pointer)

enum bolumler{elektronik, insaat, bilgisayar, makine, gida};

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

Hafta 13 Fonksiyonlar

Veri Yapıları. Amaçlar: Temel Veri Yapılarını Tanımlamalı Veri Yapılarını Veri Modeli ve Türlerini Öğreneceksiniz. İçindekiler:

1 PROGRAMLAMAYA GİRİŞ

Sunum İçeriği. Programlamaya Giriş

Dizi nin Önemi. Telefon rehberindeki numaralar, haftanın günleri gibi v.b.

BİLG Dr. Mustafa T. Babagil 1

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

HSancak Nesne Tabanlı Programlama I Ders Notları

BİL-142 Bilgisayar Programlama II

İsimler ve Kapsam. 24 Şubat Programlama Dilleri - Pamukkale Üniversitesi 1

Diziler İndisli Değişkenler

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

Dizgiler. C dilinde karakter m şeklinde tek tırnak içerisinde yazılan ifadelerdir. Bu karakterlerin her biri aslında bir tamsayı ile ifade edilir.

ENF102 TEMEL BİLGİSAYAR BİLİMLERİ VE C/ C++ PROGRAMLAMA DİLİ. Gazi Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü

C de Detaylı Üs Alma Programı. C# Dilinde Metot Tanımlama ve Yazdırma

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

Lambda İfadeleri (Lambda Expressions)

Genel Programlama II

Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz.

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Programlama Dilleri 1. Ders 5: Göstericiler

YZM 2105 Nesneye Yönelik Programlama

Bölüm 9. Altprogramlar ISBN

3/7/2011. ENF-102 Jeoloji 1. Tekrar -- Değişken Tanımlamaları (Definition) ve Veri Türleri (Data Type) Veri Tanımları ve Mantıksal Đşlemler

BİL-142 Bilgisayar Programlama II

Adım Adım C-II. Eksik kalmış konular

C PROGRAMLAMA D İ L İ

Statik veri üyeleri sınıf dosyası içerisinde, ancak sınıf bildirimi dışında başlatılmalıdır. Statik üye fonksiyonları

BÖLÜM 11: YAPISAL VERİ TİPLERİ

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-2 Değişken Kavramı ve Temel Operatörler

C++ Dersi: Nesne Tabanlı Programlama

PHP, nesne-yönelimli (object-oriented) bir dil olduğu için, nesne oluşturma imkânına ve bunların kullanılmasını sağlayan metodlara da sahiptir.

ESM-361 Mikroişlemciler. 3. Hafta Ders Öğretim Üyesi Dr.Öğr.Üyesi Ayşe DEMİRHAN

Programlama Dilleri 1. Ders 12: Belirleyiciler ve Niteleyiciler

Dizi nin Önemi. Telefon rehberindeki numaralar, haftanın günleri gibi v.b.

NESNEYE YÖNELİK PROGRAMLAMA

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-3 İşaretçiler (Pointer) (Kısım-2)

BÖLÜM 9: POINTERLER (İŞARETÇİLER)

Aynı tipten çok sayıda değişken topluluğudur. X Y Score1 Score2 (0) (1) (2)...

C Programlama Dilininin Basit Yapıları

C Programlama Dilinde Değişkenler

Değişkenler, içerisinde tek bir değer tutabilen yapılardır. Örneğin haftanın günlerini değişkenlerde tutmak istersek, her bir gün adı için bir

BLM 111 ALGORİTMA VE PROGRAMLAMA I

Sınav tarihi : Süre : 60 dak. a) strstr b) strchr c) strcat d) strcpy e) strlen. a) b) d) e) 0

İşaretciler - Pointer

Ders 8: Metotlar. barisgokce.com

Pros and Cons of Pointers. Pointers. Avantajlar. Dezavantajlar

NESNEYE YÖNELİK PROGRAMLAMA

Temel Bilgisayar Programlama Final Sınavı Çalışma Notları

BİLGİSAYAR MÜHENDİSLİĞİ ALGORİTMA VE PROGRAMLAMA II 2.HAFTA SWİTCH (CASE), SAYAÇLAR, DÖNGÜLER,

ELN1001 BİLGİSAYAR PROGRAMLAMA I

Programlama Dilleri. C Dili. Programlama Dilleri-ders08/ 1

C++ Dersi: Nesne Tabanlı Programlama

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

Operatörlere Yeni İşlevler Yüklenmesi (Operator Overloading)

Nesneye Yönelik Programlama (OOP) 7.Hafta

Yrd. Doç. Dr. Caner ÖZCAN

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

C++ Dersi: Nesne Tabanlı Programlama 2. Baskı

YZM 2116 Veri Yapıları

Dr. Fatih AY Tel: fatihay@fatihay.net

ALGORİTMA VE PROGRAMLAMA II

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

MAK 1005 Bilgisayar Programlamaya Giriş. Fonksiyonlar. Prof. Dr. Necmettin Kaya

Nesne Tabanlı Programlama

FORMÜLLER VE FONKSİYONLAR

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

PASCAL PROGRAMLAMA DİLİ YAPISI

Programlama Dilleri. C Dili. Programlama Dilleri-ders02/ 1

PROGRAMLAMAYA GİRİŞ DERS 2

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

Transkript:

C PROGRAMLAMA

Göstericiler (Pointers) C programlama dilinin en güçlü özelliklerinden biridir. Göstericiler, işaretçiler yada pointer adı da verilmektedir. Gösterici (pointer); içerisinde bellek adresi tutan değişkenlerdir. Şu ana kadar gösterilen tüm değişkenler tanımlandıkları türe göre bir değer saklarlar. Bu değere ulaşılmak istendiğinde doğrudan değişkenin ismi ile erişilebilir. Göstericiler ise değerin bulunduğu bellek hücresinin adresini tutmak sureti ile dolaylı olarak değere erişebilirler.

Neden gösterici (pointer) kullanırız? Fonksiyonlara parametrelerin referansla bağlantılı çağırma (call by reference) yöntemi ile gönderilebilmesi için pointerlar kullanılır. Aksi halde diziler haricindeki bütün parametre aktarımları değerle çağırma yöntemi (call by value) ile yapılacaktır. Devingen veri yapıları (dynamic data structures) oluşturmak ve bunlar üzerinde değişiklik yapmak için pointerlar kullanılır. Bu yapılar; Bağlı listeler (Linked List), Kuyruklar (Queues), Yığıtlar (Stacks), ve Ağaç (Trees) veri yapılarıdır. Bu veri yapıları, dizilerden farklı olarak eleman sayıalrı büyüyebilir ve küçğlebilir. Pointerlar sayesinde belleğin istenilen bir bölgesine erişim yapılabilir.

Göstericilerin (Pointers) tanımlanması ve ilk değer atanması Göstericilerde bir değişkendir, C dilinde değişkenler kullanılmadan önce tanımlanmalıdırlar. Normal değişkenlerden farklı olarak göstericiler aşağıdaki gibi tanımlanmaktadır. Yukarıdaki tanımlamada aptr bir gösterici değişkenidir. İsminin önüne gelen * işareti değişkenin gösterici (pointer) olduğunu ifade eder. aptr pointer integer değişkenin tutulduğu bellek hücresinin adresini tutacaktır. Göstericilere tanımlandıkları anda Ya da daha sonra atama deyimleri ile değer atanabilirler. Bir pointer 0, NULL Ya da herhangi bir bellek adresi olmak üzere üç farklı değer alabilirler. Bir pointerin değerinin 0 sıfır olması NULL olmasıyla aynıdır.

Gösterici Operatörleri & adres operatörü; Tek bir operand alan unary bir operatördür. Önüne yazıldığı operandın bellek adresini üretir. Buradaki operand bir değişken olmalıdır, sabit değerler olamaz. Dolayısıyla bir pointer değişkenine değer atamak için bu operator kullanılır;

& operatörü kullanımı Gösterici Operatörleri

Gösterici Operatörleri * adres operatörü; Türkçe kaynaklarda içerik operatörü Ya da dolaylı adres operatörü olarak geçmektedir. Tek operand alan unary operatördür. Önüne geldiği nesne bir adres Ya da bir adres içeren değişken (pointer değişkeni olmalıdır). Önüne geldiği adresteki değere erişmeyi sağlar. Yukarıdaki örnekte kullandığımız aptr pointer değişkenin işaret ettiği a değişkenine ulaşöak için aşağıdaki komut satırı kullanılır.

Pointer kullanımına örnek; Göstericiler (Pointers)

Göstericiler (Pointers) Fonksiyonları değerle bağlantılı (referansla) çağırma (call by reference); Bu yöntemde, çağıran fonksiyondan gönderilen değerlerin kopyalandığı değişkenlerin değişmesi orijinal değerleri etkiler. Bu yöntem C dilinde ancak pointerler kullanılarak gerçekleştirilir. Fonksiyonlar çıktı olarak geriye tek değer gönderirler. Bazen bir fonksiyondan birden fazla değer üretmesi istenebilir, fakat bu değerlerin hepsini geriye gönderemez, bu durumda fonksiyonları referansla çağırmak iyi bir yöntemdir. Bu işlemi anlatmak için kullanılan en güzel örnek takas (swap) fonksiyonudur. Takas fonksiyonu geriye hiçbir değer döndürmez, sadece kendisine gelen iki değişkenin değerlerini değiştirir.

Göstericiler (Pointers) İlk olarak düz mantıkla yani değerle (call by value) fonksiyon çağırma yöntemine göre deneyelim bakalım fonksiyona gönderdiğimiz değişkenlerin değerlerini değiştirebilecek miyiz. Görüldüğü üzere takas fonksiyonunu değerle çağırdığımızda orijinal değişkenler üzerinde (a,b) hiçbir değişiklik olmadı

Göstericiler (Pointers) Takas fonksiyonunu referansla çağırma yöntemi ile yeniden tasarladığımızda bu işlem hallolacaktır.

const belirleyicisinin pointerlar ile kullanılması Sabit (constant) kelimesinin kısaltılmış halidir. Bu belirleyici ile tanımlanmış değişkenlerin değerleri program içerisinde değiştirilemezler. Bir değişkenin değerinin değiştirilememesinin faydaları şunlardır; Yazılan programın okunabilirliğini artırır. Programı inceleyen başka biri ilk değer ataması yapıldıktan sonra const sabiti ile tanımlanmış bir değişkenin değerinin değiştirilemeyeceğini bilerek kontrol eder. Program yazılırken yanlışlıkla da olsa değişkenin değerinin değiştirilmesini önler.

const belirleyicisinin pointerlar ile kullanılması const belirleyicisi göstericiler ile üç farklı şekilde kullanılır. 1- gösterdiği değerin sabit olması; Göstericinin gösterdiği yer sabittir. Gösterdiği yere erişilip oradaki değer üzerinde değişiklik yapılamaz. Ancak göstericinin tuttuğu adres değiştirilebilir.

const belirleyicisinin pointerlar ile kullanılması 2- göstericinin kendisinin sabit olması; Gösterici değişkeninin kendisi sabittir, yani göstericinin tuttuğu adres bilgisi değiştirilemez. Ancak göstericinin içerisindeki adreste bulunan değer değiştirilebilir.

const belirleyicisinin pointerlar ile kullanılması 3- göstericinin kendisinin ve gösterdiği yerin sabit olması; Göstericinin içerisindeki adres bilgisi ve gösterdiği yer sabittir. İçerisindeki adres değeri ve gösterdiği yerdeki değer değiştirilemez.

sizeof operatörünün kullanılması C programlama dilinde değişken türlerinin ve uzunluklarının ne kadar olduğunu öğrenebilmek için sizeof operatörü kullanılır. Bu bir unary operatördür. Önüne yazıldığı operandın bellekte kapladığı alanın byte cinsinden miktarını verir.

Pointerlar üzerinde aritmetik işlemler Pointerlar aritmetik işlemler için geçerli operandlardır. Ancak taşıdıkları değerler adres olduğundan bütün aritmetik işlemler uygulanamaz. Göstericiler üzerinde yalnızca toplama ve çıkarma işlemleri (+, -, ++, --, +=, -=) uygulanabilir. Burada dikkat edilmesi gereken nokta; bir göstericiden tamsayı çıkartıldığında yada toplandığında içindeki adres gösterdiği türün bellekte kapladığı alan kadar artar yada azalır. aptr değişkenini bir artırmak yada azaltmak demek onu 1*sizeof(long) kadar artırmak yada azaltmak anlamına gelir.

Göstericiler ile diziler arasındaki ilişkiler C dilinde diziler ve göstericiler hemen hemen birbirinin yerlerine kullanılabilirler. Dizi isminin dizinin başlangıç adresinin tuttuğunu hatırlayınız. Dolayısıyla dizinin adı da bir gösterici (pointer) gibi düşünülebilir. Dizilerde dizinin her bir elemanına erişmek için köşeli paranter içinde indis numarası kullanılır. Böyle bir ifadeden derleyici, başlangıç adresinden verilen indis numarası kadar sonraki adreste bulunan elemana gidileceğini anlar. Anlaşılıyor ki derleyici, adres üzerinde artırma ve eksiltme operasyonları ile diğer dizi elamanlarına erişmektedir.

Göstericiler ile diziler arasındaki ilişkileri göstermek için bir örnek;

void Göstericiler Bir gösterici (pointer) içerisindeki adres başka bir gösterici içerisine atanabilir, ancak gösterdikleri türlerin birbirine uygun olması gerekir. Bu kuralın dışında void göstericiler genel gösterici (generic pointer) olarak tanımlanırlar. Herhangi bir göstericinin değeri (yani içindeki adres) void göstericiye atanabilir, tam terside gerçekleşebilir. bu tür göstericiler adreslerin yedeklenmesi yada yer değiştirme işlemleri için kullanılabilirler. Void türü olmayan anlamına geldiğinden herhangi bir değeri referans edemezler, buda onların * ve [ ] gibi operatörler ile kullanılamayacağı anlamına gelir. Aritmetik işlemlerde void göstericiler üzerinde uygulanamaz.

void Göstericiler

fonksiyon Gösterici(pointer to function) Fonksiyonlarda diğer değişkenler ve diziler gibi belleğe yüklenirler. Fonksiyonlarında bir başlangıç adresleri vardır. Dizilerde olduğu gibi fonksiyonun adı da fonksiyonun başlangıç adresini tutar. Bir gösterici yardımıyla bir fonksiyonun adresini tutabilir ve bu gösterici yardımıyla fonksiyonu kullanabiliriz. int topla(int, int); //fonksiyonunu gösteren bir gösterici aşağıdaki gibi tanımlanır. int (*pf)(int, int); Bu gösterici sadece yukarıdaki şekilde tanımlanan fonksiyonları gösterebilir. (İki adet int tipli parametre alan ve geriye int tipli bir değişken döndüren fonksiyonları gösterebilir.

fonksiyon Gösterici(pointer to function)

fonksiyon ların başka fonksiyonlara paremetre olarak gönderilmesi Fonksiyonlar, göstericiler ile temsil edilebildiğinden ve göstericilerde birer değişken olduğundan başka fonksiyonlara parametre olarak gönderilebilirler. Gönderilecek olan fonksiyonda argümanlar fonksiyon işaretçisi şeklinde tanımlanmalıdır.

fonksiyon ların başka fonksiyonlara paremetre olarak gönderilmesi

fonksiyon ların başka fonksiyonlara paremetre olarak gönderilmesi