Merhaba, tekrar hoş geldiniz.
Yeni bir bölümdeyiz. Bu bölüm işaretçiler olarak adlandırılmıştır.
Bu muhtemelen kursun en önemli bölümüdür.
Aynı zamanda muhtemelen parkurun en zor bölümüdür. İşaretçiler ve c
kavramı çok ama çok zor bir kavramdır.
Ama çok yavaş ilerleyeceğiz.
Çok sayıda ders vereceğiz ve adım adım ilerleyeceğiz.
En üst düzeyden başlayacağız ve giderek daha fazla ayrıntıya gireceğiz.
C dilinden tam olarak yararlanmak istiyorsanız işaretçileri anlamanız
gerekir. Bu yüzden çok önemli.
Şimdi en baştan başlayalım ve esasen bir işaretçi ile aynı kavram
olan bu dolaylama kavramından bahsedelim.
Yani işaretçiler dolaylama kavramına çok benzer.
Günlük yaşamınızda dolaylama kullanıyorsunuz. Örneğin, dolaylamanın ne anlama
geldiğini açıklayacak olursam, şirketinizde
yeni bir şey, yeni bir ürün satın almak zorunda kalmanız gibi.
Örneğin, yazıcınız için yeni bir mürekkep kartuşu almanız gerektiğini varsayalım.
Eğer büyük bir şirkette çalışıyorsanız, yeni bir şey satın
almak için muhtemelen belirli bir departmandan
geçmeniz gerekecektir. Yani muhtemelen satın alma departmanına gidersiniz.
Muhtemelen satın alma bölümünden birini arar ve
sizin için yeni kartuş sipariş etmesini istersiniz.
Daha sonra sipariş etmek istediğiniz ürünü sağlayan
yerel bir mağaza bulmak onların işi olacaktır.
Bunun anlamı, gidip o ürünü doğrudan kendiniz sipariş etmiyorsunuz.
Birinden bunu sizin için yapmasını istiyorsunuz.
Ve sonra uzmanlıkları ve envanterde o ürünün kimde olduğuna
dair bilgileri sayesinde ürünü size geri getiriyorlar.
Yani bu sizi ilgilendiren bir dolaylılık düzeyi. Gidip mağazadan satın
alamazsınız. Satın alma departmanına gidiyorsunuz, o
kişinin departmanı sizin için gidip her şeyi yapacak bilgiye sahip.
Bu, programlamadaki işaretçi kavramıyla aynıdır.
Programlama dillerinde dolaylama, değerin kendisi yerine bir isim, referans veya
konteyner kullanarak bir şeye referans verme yeteneğidir.
Değişken adlarını kullanarak bir etkileşim biçimi kullanıyoruz.
Verilere erişmek için bellek adresini kullanmayız.
Bir değişken adı kullanırız.
En yaygın dolaylama biçimi, bir değeri bellek adresi üzerinden
manipüle etme eylemidir.
Dolayısıyla, bir bellek adresini temsil etmek
için bir değişken adı kullanarak gerçekten küçük bir dolaylama tanımına ek olarak, adresin kendisini
kullanarak bellek adresi aracılığıyla bir değeri de manipüle edersiniz.
adresin kendisi.
Dolayısıyla bir işaretçi, belirli bir veri öğesinin değerine erişmek için dolaylı bir yol sağlar.
Değeri bir bellek adresi olan bir değişkendir
ve bunu anlamak çok önemlidir.
Bu noktaya kadar belirli veri türlerini, sayıları, karakterleri,
çiftleri, rasyonel sayılar ile kayan
sayıları içeren değişkenleri öğrendik.
Şimdi bu tür verilerin hiçbirini depolamayan
bir değişkenimiz olacak.
Veri depolarının türü bir bellek adresidir.
Bellek adresi bir tamsayı, onaltılık bir sayı olarak gösterilecektir,
ancak yine de bir bellek adresi
olacaktır.
Dolayısıyla, mevcut bir değişken
veya dinamik olarak ayırdığınız yeni bir konumsa, bir adresin ve
başka bir bellek konumunun değeri olacaktır.
Dolayısıyla, yeni kartuş siparişi vermek için satın alma departmanından
geçmenin mantıklı olmasının nedenleri olduğu gibi, örneğin
kartuşların hangi mağazadan sipariş edildiğini bilmek zorunda değilsiniz.
İşaretçileri kullanmanın mantıklı olması için iyi nedenler de vardır
ve c Bir adresi, bir bellek adresini temsil eden bu değişkenleri kullanmak için.
Dersin en başında bellek adreslerinden bahsetmiştik.
Ve bir programı çalıştırdığınızda ve değişkenler oluşturduğunuzda bunların bellekte nasıl saklandığını.
Ve bu belleğin belirli bir adresi vardır. Bu verileri geri almak için adresi bilmeniz
gerekir, tıpkı bir yere arabayla gidecekseniz bir evin adresini veya bir yerin adresini bilmeniz
gerektiği gibi.
Dolayısıyla, programınızda işaretçileri kullanmak c dilinde bulunan en güçlü araçlardan biridir.
İşte bu yüzden anlamak önemlidir.
C dilinde önemli olan her program işaretçi kullanacaktır.
Dolayısıyla bu kavramı anlamak zorundasınız.
Java ya da C sharp gibi daha modern dilleri programlayan
programcılar için bu konuda endişelenmenize
gerek yoktur çünkü tüm bellek
tahsisi ve gerçek bir işaretçi kavramı
yoktur.
Kaputun altında olsa bile, java
işaretçileri kullanır çünkü referansların kopyaları vardır.
Aynı türden bir kavram. Ancak c'de, açıkça bir adresi temsil
eden bir değişkene sahip olursunuz.
İşaretçiler aynı zamanda c dilinin en kafa karıştırıcı kavramlarından biridir.
Özellikle yeni programcılar tarafından
istismar edilme ve tam olarak anlaşılmama eğilimindedirler.
Bu nedenle, bu kavramı başlangıçta anlamanız ve gittikçe
daha gelişmiş c ve daha gelişmiş işaretçi kavramına
girdikçe neler olup bittiğine dair net bir fikre sahip olmanız önemlidir.
Eğer başlangıçta bunu anlamadıysanız, çalışın,
çalışın, çalışın, işaretçilerle kod yazma alıştırması yapın.
Derleyici, işaret ettiği değişkende depolanan
veri türünü bilmek zorundadır. Yani tıpkı normal bir değişken gibidir
ve işaretçiyi oluştururken veri türünü belirtmeniz gerekir.
Derleyicinin bunu bilmesi gerekmesinin nedeni değişkenlerle aynıdır, bazı
verilere işaret ediyor olsanız bile ne kadar veri ayıracağını bilmesi gerekir.
Her işaretçi belirli bir değişken tipiyle ilişkilendirilecektir.
Sadece o tipteki değişkenlere işaret etmek için kullanılabilir,
bir işaretçi tanımlamaktan bahsederken buna bir örnek vereceğiz.
Bu nedenle, örneğin pointer tipindeki işaretçiler
yalnızca int tipindeki değişkenleri işaret edebilir.
Yine, bir değişkenin bir adres
değeri vardır, bu bir işaretçidir.
Bu adres bellekte bir yerde bir değer içerebilir.
Pointer to float türündeki işaretçiler yalnızca float türündeki değişkenleri işaret edebilir.
İşte size işaretçi kavramını
veren açıklayıcı bir fikir.
Sözdizimi konusunda endişelenmeyin.
Daha önceki derslerde bu ve işareti ve yıldız işaretini kısaca tartışmıştık, bu konuda
endişelenmenize gerek yok. Burada dikkat etmenizi istediğim
şey, bir işaretçinin nasıl bir adrese sahip olduğu ve bu adresin bir değer
içerebileceği ancak bellekte başka bir yerde olabileceğidir.
Bu örnekte, normal bir sayı oluşturuyoruz, bir milyon
kez oluşturduk, sonra bunun bir işaretçi olduğunu gösteren yıldız işaretli
bu sözdizimini görüyorsunuz. Bunu ayrıntılı olarak inceleyeceğiz.
Ayrıca, bunun bir adres olduğunu gösteren ve işareti de görürsünüz.
Yani bu örnekte int p number türünde bir işaretçi oluşturduğumuzda
bir adres atamış oluyoruz. Çünkü unutmayın, işaretçiler yalnızca adresleri saklayabilir.
Bunun bellekte gerçekte nasıl düzenlendiğine
gelince, number adında bir değişkeniniz
var ve number 99 değerine sahip.
Sayının ayrıca bellekte bir adresi vardır.
Bellekteki bu adres işaretçinin değeridir.
Yani p numarası 1008 adresini gösteren bir işaretçidir.
1008'in değeri 99'dur ve değişken numarasını
da içerir.
Yani aslında varmak istediğimiz nokta bu. Eğer bu net değilse, bir saat boyunca buna bakmanız
ve anladığınızdan emin olmanız gerekir.
Tekrar etmek gerekirse, bir işaretçinin bir adrese değeri
vardır, sakladığı şey budur.
Ve sonra belirli sözdizimlerini kullanarak bu adresteki değere erişebilirsiniz.
Öyleyse neden işaretçi kullanalım, neden bu kavramı gündeme getirelim, neden kullandığımız
mevcut veri türlerini kullanmayalım ve dizeleri
kullanmak istediğimizde karakter dizisini kullanmayalım.
Verilere yalnızca değişkenler aracılığıyla erişmek çok sınırlayıcıdır.
İşaretçilerle herhangi bir konuma erişebilir, örneğin belleğin herhangi bir konumunu
bir değişken olarak ele alabilir ve ardından işaretçilerle aritmetik de gerçekleştirebilirsiniz,
bu da işleri kolaylaştırır.
c'deki işaretçiler dizileri ve dizeleri kullanmayı kolaylaştırır
ve bunun üzerinden de geçeceğiz, bu da işaretçileri kullanmanın bir başka avantajıdır.
İşaretçiler, aynı alana ve belleğe birden fazla konumla başvurmanıza olanak tanır.
Yani bunun anlamı, belleği bir konumda güncelleyebilir
ve ardından değişiklik programınızdaki başka bir konumdan görülebilir.
Bu, global verileri kullanmanın ama yine de fonksiyonların içinde kapsüllemenin bir yoludur.
Ayrıca veri yapılarınızdaki bileşenleri paylaşarak bellek alanından büyük ölçüde tasarruf
edebilirsiniz.
Unutmayın, c icat edildiğinde, c 70'lerde icat edilmişti.
C fikri çok verimli ve düşük seviyeli olmaktı.
Belleğe doğrudan işaretçiler aracılığıyla erişme fikri çok
verimlidir ve aynı
zamanda çok hızlıdır.
İşaretçiler ayrıca işlevlerin kendilerine değişken olarak aktarılan verileri değiştirmesine
de olanak tanır. Bu referans olarak aktarılır. Bu konuda bir konferans vereceğiz.
Bu, işaretçilerinizle bir işleve argüman aktarabileceğiniz yerdir.
Ve sonra fonksiyonun içinde, bu verileri değiştirdiğinizde,
değişiklik fonksiyonun dışına yansıtılacaktır.
Yani artık küresel verileri kullanmak zorunda değiliz.
Bir fonksiyonun içinde veri kullanabiliriz, bu veriyi bir işaretçi
olarak aktarabiliriz ve daha sonra bu veri fonksiyonun dışında
tahsis edilir. Dolayısıyla, her şeyin birbirine sıkı sıkıya
bağlı olduğu küresel değişkenleri kullanmanın dezavantajına sahip değildir,
bunu yalnızca bu verileri bilmesi gereken işlevlerin bilmesi gereken verilerle sınırlayabilirsiniz.
Bahsettiğim gibi, programı daha hızlı çalışacak ve normalde olduğundan daha az bellek
kullanacak şekilde optimize etmek için de kullanılabilir;
bu, özellikle gömülü gerçek zamanlı
programlarda önemli bir kavramdır.
Pointer'lar ayrıca bir fonksiyondan birden fazla değer almamızı sağlar.
Veri fonksiyonlarını nasıl aktarabileceğiniz konusunda fonksiyonlardan bahsettik.
Verileri nasıl geri döndürebileceğinizden de bahsetmiştik.
Şu anda bir fonksiyondan yalnızca bir değer döndürebileceğinizi biliyoruz.
Ancak işaretçi kullanırsanız, aslında bir işlevden birden fazla değer döndürebilirsiniz.
Ve bunun hakkında konuşacağız. Bu büyük bir avantaj.
Ayrıca dinamik bellek tahsisi hakkında da konuşacağız.
Şu anda bir program için bellek oluşturduğumuzda, bu işlem bir değişken bildirdiğinizde
derleyici tarafından dolaylı olarak yapılmaktadır.
Örneğin, bir int değişkeni bildirirseniz, bu değişken için otomatik olarak 4 bayt oluşturur.
Dizileri kullandığınızda ve bir dizinin boyutunu belirttiğinizde,
bu boyut derleme zamanında ayrılır.
Yani bundan daha fazla veri depolamaya çalışıyorsanız, hapı yuttunuz demektir,
programınız çalışmayacaktır.
Ancak çalışma zamanında ihtiyaç duyduğunuz
kadar bellek yaratma yeteneğiniz olsaydı, bu çok
büyük olurdu. Ve işaretçiler bunu yapmanızı sağlar.
Çalışma zamanında dinamik bellek oluşturmanıza, bellek ayırmanıza izin verirler.
Bu konu hakkında da konuşacağız.
İşaretçiler daha karmaşık veri yapıları tasarlamamızı ve geliştirmemizi sağlar.
Veri yapısı ise verileri depolayan bir şeydir.
Veri yapılarına örnek olarak işaret yığını veya bağlı liste verilebilir.
Ve işaretçileri kullanarak bunları çok daha kolay oluşturabiliriz.
Pointer'lar doğrudan bellek erişimi sağlar, yine verimli ve hızlıdır.
Yani işaretçiler büyük bir kavram olacak. İşaretçiler hakkında çok fazla ders vereceğiz.
Tüm bu kavramlardan bahsederken odaklanmanızı ve dikkatinizi vermenizi istiyorum
çünkü bunlar c programlama dilini anlamak için önemli ve hayati önem taşıyor.
İyi şanslar, hadi başlayalım. Teşekkür ederim.