Değişkenler ve işaretçiler arasındaki fark nedir?


10

OO ve Fonksiyonel programlamadaki farklılıkları özetleyen bir makaleyi okurken , fonksiyon göstergelerine rastladım. Bilgisayar Bilimi diplomamı (2003) tamamladığımdan bu yana bir süre geçti ve hafızamı yenilemek için işaretçiler aradım.

İşaretçiler bir bellek adresine başvuru içeren değişkenlerdir. Bu tür bir veri varsa, o bellek adresinde bulunan verileri işaret ettikleri düşünülebilir. Veya makalede olduğu gibi, kodun bir bölümüne giriş noktasını gösterebilirler ve bu kodu çağırmak için kullanılabilirler.

Bu neden bir değişkenten farklı? Değişkenler, bellek adresleri için sembolik adlardır ve derleyiciler adı gerçek adresle değiştirir. Bu, değişkenlerin bellek konumlarına referanslar içerdiği ve bu tür bir veri varsa bu adresteki verilere işaret ettiği düşünülebilir.

Fark davranış içindeyse (belki bir işaretçi çalışma zamanında yeniden atanamaz veya yalnızca sembolik bir değişken adı verilebilir, başka bir değer atanamaz), bu sadece belirli bir türün değişkeni olduğu anlamına gelmez, işaretçi türü? Tam olarak tür tamsayı olduğu bildirilen bir değişken, derleme tarafından ne için kullanılabileceğiyle sınırlandırılır.

Burada ne eksik?


4
Hiçbir şey, bir işaretçi, anlamsal yorumu değişkenin içeriğinin bir adres olduğu etkili bir türdür. Tabii ki iki adres var, işaretçinin adresi (yani değişkenin saklandığı yer) ve işaretçinin başvurduğu adres (değişkenin adresindeki gerçek veriler) vardır. İşaretçi bir referans türüdür .
Luke Mathieson

Yanıtlar:


8

Sorunuz çeşitli şekillerde ilginçtir, çünkü çeşitli konular için dikkatli ayrımlar gerektirir. Ama görüşün bana göre doğru. Cevabımı yanıltmaktan kaçınmak için bu cevabın çoğunu yazmadan önce referansınızı okumadım.

İlk olarak, Variables are symbolic names for memory addressesifadeniz neredeyse doğrudur, ancak kavramı ve her zamanki uygulamasını karıştırır. Değişken aslında sadece değiştirilebilen bir değer içerebilen bir kaptır. Genellikle, bu kap bir bilgisayarda bir bellek alanı kabı olarak uygulanır ve karakteristik ve adres ve boyut olarak karakterize edilir, çünkü değişkenler az ya da çok bilgi içeren temsiller gerektiren bir nesne içerebilir.

Ancak, uygulama tekniklerinden bağımsız olarak, çoğunlukla dilbilimin anlambilimine ilişkin daha soyut bir bakış açısını ele alacağım.

Yani değişkenler soyut bir bakış açısından sadece kaplardır. Böyle bir konteynerin bir adı olması gerekmez. Bununla birlikte, diller genellikle bir tanımlayıcı ile ilişkilendirilerek adlandırılan değişkenlere sahiptir, bu nedenle değişkenin kullanımları tanımlayıcı tarafından ifade edilebilir. Bir değişken aslında çeşitli takma mekanizması aracılığıyla birkaç tanımlayıcıya sahip olabilir. Bir değişken ayrıca daha büyük bir değişkenin alt bölümü olabilir: bir örnek, dizi değişkenini ve hücrenin dizinini belirterek adlandırılabilen, ancak aynı zamanda diğer adlandırma yoluyla tanımlayıcılarla ilişkilendirilebilen bir dizi değişkeninin hücresidir.

Teknik olarak semantik olarak yüklenebilecek diğer kelimeleri çağırmaktan kaçınmak için kasıtlı olarak biraz tarafsız olan kelime kabını kullanıyorum . Aslında , genellikle bir bellek adresiyle karıştırılan, Wikipedia'da açıklanan referans kavramına yakındır . Kelime işaretçi kendisi genellikle bir bellek adresi olarak anlaşılmaktadır, ama uygunsuz olduğu gibi, en üst düzey dilleri dikkate ve (adresler kullanılabilir olsa da) size başvurmak tartışma yazısında muhtemelen uygunsuz zaman o anlamlı olduğunu düşünmüyorum belirli bir uygulamaya atıfta bulunur. Bununla birlikte, uygulama kavramlarına ve makine mimarisine çok daha yakın olması gereken C gibi bir dil için uygundur.

Aslında, uygulama düzeyindeki değişkenlere veya değerlere bakarsanız, "makine seviyesi işaretçileri" nin birkaç karmaşık dolaylı sistem sistemi olabilir, ancak bunlar kullanıcı tarafından görülemez (ve olmalıdır), böylece soyut bakış açısı Geliştirdiğim geçerli olabilir. Çoğu programlama dilinde, uygulama belirli bir dil için çok farklı olabileceğinden, kullanıcının uygulama hakkında endişelenmesi ve hatta bilmesi gerekmez. Bu, açık ikili kodlama ile neredeyse doğrudan ilişki içinde olan montaj dillerinin gelişmiş bir yerine geçen, makine mimarisine kasıtlı olarak yakın olan C gibi bazı diller için doğru olmayabilir, ancak çoğu yerde rahat kullanım için çok düşük bir düzeydir. durumlar.

Bir dil kullanıcısının bilmesi gereken ve bazen bundan daha az olması gereken, değerler ve ilişkili işlemler, içerilebilecekleri, isimlerle nasıl ilişkilendirilebileceği, adlandırma sisteminin nasıl çalıştığı, nasıl yeni olabilir tanımlanacak değer türleri vb.

Başka bir önemli kavram tanımlayıcılar ve isimlendirmedir. Bir varlığın (bir değerin) adlandırılması, bir tanımlayıcının bir değerle ilişkilendirilmesiyle yapılabilir (genellikle bir bildirimde). Ancak, diğer adlandırılmış değerlere işlemler uygulanarak da bir değer elde edilebilir. İsimler yeniden kullanılabilir ve kullanım bağlamına göre belirli bir tanımlayıcıyla neyin ilişkilendirildiğini belirlemek için kurallar (kapsam belirleme kuralları) vardır. Tam sayı gibi bazı alan adlarının değerlerini adlandırmak için litterals adı verilen özel adlar da vardır (ör.612) veya boole (ör. doğru ).

Değişmeyen bir değerin bir tanımlayıcı ile ilişkilendirilmesine genellikle sabit denir. Okuryazarlar bu anlamda sabitlerdir.

"Değer kapları" da değerler olarak kabul edilebilir ve bunların tanımlayıcı ile ilişkilendirilmesi, kullandığınız "naif" anlamda bir değişkendir. Yani bir değişkenin "kap sabiti" olduğunu söyleyebilirsiniz.

Şimdi, bir tanımlayıcının bir değerle (sabit bildirim) ilişkilendirilmesi veya bir değişkene bir değer atanması arasındaki, yani kapsayıcı sabiti olarak tanımlanan kapta değeri saklamanın arasındaki farkın ne olduğunu merak edebilirsiniz. Esasen bildirim, sözdizimsel bir varlık olan bir tanımlayıcıyı anlamsal bir varlık olan bir değerle ilişkilendiren bir gösterimi tanımlayan bir işlem olarak görülebilir. Atama, bir durumu değiştiren, yani bir kabın değerini değiştiren tamamen semantik bir işlemdir. Bir anlamda beyan, anlambilimsel varlıklar için bir adlandırma (sözdizimsel) mekanizması sağlamaktan başka anlamsal etkisi olmayan bir meta kavramdır.

Aslında ödevler, program yürütülürken dinamik olarak gerçekleşen anlamsal işlemlerdir, bildirimler daha sözdizimsel niteliktedir ve genellikle yürütme işleminden bağımsız olarak programın metninde yorumlanmalıdır. Bu nedenle statik kapsam belirleme (metinsel kapsam belirleme) genellikle tanımlayıcıların anlamını anlamanın doğal yoludur.

Tüm bunlardan sonra, bir işaretçi değerinin bir kapsayıcı için başka bir ad olduğunu söyleyebilirim ve bir işaretçi değişkeni bir kap değişkeni, yani başka bir kap içerebilen bir kap (sabit) (bazıları tarafından dayatılan içeren oyunda olası sınırlamalarla) tip sistemi).

Kod ile ilgili olarak, [pointers] might indicate the entry point to a section of code and can be used to call that code. Aslında bu tam olarak doğru değil. Kodun bir bölümü genellikle tek başına anlamsızdır (yüksek düzey veya uygulama açısından). Üst düzey bir bakış açısından, kod genellikle tanımlayıcılar içerir ve bu tanımlayıcıları bildirildikleri statik bağlamda yorumlamanız gerekir. Ancak aslında aynı statik bağlamın olası bir tekrarı vardır, esasen dinamik (çalışma zamanı) fenomeni olan özyineleme nedeniyle ve kod yalnızca statik bağlamın uygun bir dinamik örneğinde yürütülebilir. Bu biraz karmaşıktır, ancak sonuç, uygun kavramın, bir kod parçasını ve tanımlayıcıların yorumlanacağı bir ortamı ilişkilendiren bir kapaktır. Kapatma uygun semantik kavramdır, yani düzgün tanımlanabilir bir semantik değerdir. Sonra kapatma sabitleri, kapatma değişkenleri,

Bir işlev, genellikle bazı varlıklarını (sabitler ve değişkenler) tanımlamak veya başlatmak için bazı parametreler içeren bir kapatma işlemidir.

Bu mekanizmaların kullanımıyla ilgili birçok varyasyonu atlıyorum.

Kapaklar, zorunlu veya işlevsel dillerde OO yapılarını tanımlamak için kullanılabilir. Aslında, OO stili (muhtemelen adından önce) üzerinde erken çalışma bu şekilde yapıldı.

Hızlı bir şekilde gözden geçirdiğim referansta bulunduğunuz makale, yetkili bir kişi tarafından yazılmış ilginç bir makale gibi görünüyor, ancak çeşitli diller ve bunların temeldeki hesaplama modelleri ile önemli bir deneyiminiz yoksa muhtemelen kolay bir okuma değil.

Ancak unutmayın: Tutarlı bir görüşü koruduğu sürece, birçok şey seyircinin gözündedir. Bakış açıları farklı olabilir.

Bu sorunuza cevap veriyor mu?

Not: Bu uzun bir cevap. Bunun bir kısmını yetersiz bulursanız, lütfen hangisi olduğu konusunda açık olun. Teşekkür ederim.


Birkaç kez okumak zorunda kaldım ama bence sorumu cevaplıyor, evet. Tanımlarım çok uygulama merkezli olmasına rağmen, bir işaretçinin belirli bir değişken türü olduğu fikri doğru görünmektedir, yani "işaretçi değeri bir kapsayıcı için yalnızca başka bir addır ve işaretçi değişkeni bir kapsayıcı değişkendir" Burada değilim yaptığınız ayrımı bir kod bloğunun adresini içeren bir işaretçi ile bir kapatma içeren bir kap içeren bir kapsayıcı arasında olsun. Statik bir bağlam ile yürütülmekte olan bir program arasındaki fark mı?
NectarSoft

1
@NectarSoft Ayrımı yalnızca kod bloğu ve kapatma arasındadır. Ne diyorsun, kendi başına, herhangi bir bağlamdan izole, bir kod bloğu genellikle hiçbir şey anlamına gelir. Eğer " eğer mome rathlar borogolardan daha büyükse, o zaman toves aşıldı " dersem , cümlenin hiçbir anlamı yoktur çünkü tüm bu kavramların tanımlandığı bağlamı kaçırırsınız. Bu statik bağlam genellikle kod parçasını çevreleyen metindir. Sorun, bu statik bağlamın kendisinin birkaç çalışma zamanı örneğine sahip olması ve kod parçasının bunlardan yalnızca birine başvurması gerektiğidir.
babou

1
@NectarSoft (devam) Yani kapanış değeri, kod parçasının birleşimi ve bu parçaya anlam veren dinamik bir statik bağlam örneğidir. Aynı kod parçasının aynı statik bağlamın farklı bir dinamik örneğiyle ilişkilendirilmesi farklı bir kapanış sağlar. Tipik olarak, kodunuz bu bağlama ait bir değişken kullanabilir, ancak adı (statik olarak tanımlanmış) aynı kalsa da, içeriğin her dinamik örneği için farklı bir değişken olacaktır. Bu, sorunu netleştiriyor mu yoksa yanıtta bir örnek oluşturmalı mıyım (yorum formatı kısıtlanmıştır)?
babou

Konuyu açıklığa kavuşturuyor, teşekkürler, düşünmek için biraz zaman harcayacağım diğer soruları gündeme getiriyor. Örneğin, her bir kapak için ayrı bir işaretçi gerekiyorsa, işaretçi dinamik bağlamın bir parçası haline gelir ve bu nedenle kapak içinde olur! Ayrıca bir statik kod bloğu ile ilişkili ve bir işaretçi tarafından başvurulan bu bağlamların her biri mutlaka kendi kapanışında bir değişken olacağından, kapatma sınırlarını ve kapatma hiyerarşisini merak ediyorum. Ancak tüm bu konu kapalı olduğunu, bu yüzden biraz okuma yapacağım ve belki bir kez daha sıkışıp kaldım başka bir soru ortaya
NectarSoft

@NectarSoft Aslında. bir kapatma oluşturduğunuzda, kodla ilişkili bağlamı o koda doğru bir anlam vermek için gerekli olanla sınırlandırmaya çalışırsınız (mikro yönetim bilgisini önlemek için bazı pratik kısıtlamalara kadar). Buna statik olarak karar verilebilir.
babou

2

Fark, tanım ve uygulamaya göre, bir işaretçi başka bir değişkenin bellek adresini tutmak için özel bir değişkendir; OO terimlerinde, bir işaretçi davranışını değişken adı verilen genel bir sınıftan miras almış olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.