Cevap 1:

Bir c ++ programcısının perspektifinde (düşük seviye c, asm gibi farklı olabilir), akutal bellek adresleri hakkında hiçbir şey bilmemelisiniz. Programda belleğe bir işaretçi ile erişirsiniz. Bu işaretçideki değer gerçek bir bellek adresine karşılık gelebilir. Ancak durum böyle olmak zorunda değil. Nullptr değerinin de 0 değeri olması gerekmez. Başka değerler de (örneğin FFFFFFFF) mümkün olabilir. Bunu hatırlayan makinelerin olduğunu hatırlıyorum.

Sınıfınızı yazmak gibi, yapıyı veya diziyi somutlaştırın ve aşağıda gerçekten neler olduğunu bilmenize gerek yok. Örneğin. daha sonra silmek için uzunluğu ve türü belirtmek üzere her diziden önce bazı baytlar vardır.

Thomas


Cevap 2:

C ile bir bellek adresi ve işaretçi arasındaki fark nedir?

Konuya nasıl yaklaştığımıza bağlıdır. Çalışma zamanında yansıması olmayan ve türü değişmeyen, statik olarak yazılan bir dil olan C'nin, değişkenler gibi ilkellere sahip olması ve mümkün olduğunca az özeti olması önemlidir. Bir bayt, lanet bir bayttır. Bu çok önemli.

Bu perspektiften bakıldığında, çalışma zamanı sırasında, bir işaretçi ve bir bellek adresi arasında ayrım yapmak için kesinlikle hiçbir neden yoktur: çünkü kimse, belirli bir anlamı kabul eden kod dışında, orada ne olduğunu ve nasıl yorumlanacağını gerçekten bilmiyor. Bir saniyeliğine sendikalardan başka düşünmeyin.

Bu varsayım koda derlenmiştir, dolaylı olarak yerleştirilmiş bir tür tanımlayıcısı yoktur veya dinamik olarak yazılan bir dille karşılaştırıldığında ne düşünebilirse. Geliştirici, bir birliğin tüm varyantlarında veya ortak bir üstbilgiyi paylaşan yapılarda bir tür gösteren bir yapıya bir alan yerleştirebilir ve ardından bir anahtar kullanabilir (veya ortak üstbilgide bulunan stratejileri kullanabilir), ancak bu bir dil değildir özelliği, elle uygulanması gerekir. Her şey, kodda derlenen varsayımlar ile bellek adreslerinde çalışan bayt koduna kadar kaynar. Rastgele bir bellek alanını belirli bir türün yapısı olarak mı referanslıyorsunuz? Veriler rastgele olacaktır ancak kodun bunu yaparken bir sorunu yoktur.

Derleme zamanına kadar kaynak kodu başka bir hikaye. Kaynak kodunda derleyici ve IDE vidalanmamamıza yardımcı olur. O kadar kolay değil. Yazım sistemini uygun şekilde kullanmak geliştiricinin bozulmamasına yardımcı olur, ancak daha sonra yanlış yazılmış tip tanımlarının küçük bir miktar bile değişmesi durumunda bir şeyler havaya uçurabilen veya üfleyemeyen tip dökümler (zorla varsayımlar olarak da bilinir) vardır.

Bellek adreslerine başvururken tutarlılığı kontrol eden, geliştiricinin varsayımlarının teslim alındığını kontrol eden derleyicidir. Yani bu anlamda daktilo işaretinin fazladan bilgi taşıdığını söyleyebiliriz. Geliştiricinin türlerle ilgili varsayımları kontrol edilmezse, bir derleyici uyarısı veya hatası ve hatası vardır. Kontrol ederlerse (veya tutarlılık kontrolünü bastırarak kontrol etmeye zorlanırlarsa), bu varsayımlar, kod türüne bellek adresleriyle çalışmanın örtülü yolları olarak, esas olarak tür bilgisinden çıkarılır.

Uzun öykü kısa: derleme zamanına kadar, bellek adresleri türü taşır - bu yüzden C kullanmıyoruz… bellek adresi ofsetleri. C'nin hiç yansıması olmadığından, çalışma zamanı sırasında tür bilgisi yoktur, bu nedenle işaretçiler bellek adresleridir ve hepsi budur.


Cevap 3:

Fark incedir.

Bellek adresi, bellekteki bir şeyin konumudur.

İşaretçi, bir bellek adresi içeren bir değişkendir (veya parametredir).

Dolayısıyla, bir işaretçi bir bellek adresi değildir… bir bellek adresi içeren bir kaptır.

İşaretçi, diğer değişkenler gibi, işaret edilen tarihin türü hakkında bir şeyler söyleyen bir veri türüne sahiptir. Örneğin, "işaretçi - int", "işaretçi - karakter" den farklı bir veri türüdür. “Boşluk gösterici” bilinmeyen bazı veri türlerinin göstergesidir.

İşaretçi bir değişken olduğu için belleği kaplar. Dolayısıyla, pointer değişkeninin kendi bellek adresi vardır. Dolayısıyla, bir işaretçi değişkeni verildiğinde, gerçekten iki bellek adresi söz konusudur. Bellek adreslerinden biri işaretçi değişkeninin içinde saklanır ve bellekteki başka bir şeye işaret eder. İşaretçi değişkeninin kendisinin belleğindeki konum ise diğer bellek adresi.


Cevap 4:

İşaretçi, bellek adresini tutan bir değişkendir. Dolayısıyla fark, 3 gibi bir tam sayı ile n gibi bir tam sayı değişkeni arasındaki farktır.

İşaretçi şöyle bildirilen bir değişkendir:

int * p; şamandıra * q;

Sonra p ve q işaretçilerdir.

Bellek adresleri ise bazı durumlarda ortaya çıkar:

  1. Adres operatörünü bir değişkene uyguladığınızda: x bir tür değişkeniyse & x onun adresidir. V [10] gibi bir dizi bildirirseniz; v dizisinin adı, v'nin adresidir. ilk eleman. Yani v, & v [0] ile aynıdır. “Abcd” gibi bir dizgi değişmezinin değeri ilk öğesinin adresidir. Parantez (ve dolayısıyla bağımsız değişkenler olmadan) bir işlev adıdır. bu işlevin adresi.

C'deki işaretçilerin ve bellek adreslerinin tür hakkında bilgi tutabileceğine dikkat edilmelidir. Örneğin, beyanda

int * p;

p, int türünde bir göstericidir, böylece * p ve p [n] derleyici tarafından bir tamsayı olarak anlaşılır. Aynı durum bellek adresleri için de geçerlidir: n bir tamsayı değişkeniyse,

int n;

dereference operatörünü adresine uygulayabilir, yani * (& n) derleyici tarafından int olarak anlaşılır (aslında * (& n) n'ye karar verir). Derleyici uyumsuz işaretçi hatalarını kontrol edebildiğinden bu önemlidir. Örneğin,

int n; çift * p; p = & n;

bir hata olarak algılanacaktır.

Bu kuralın istisnası, türü olmayan ve bu nedenle kayıttan kaldırılamayan geçersiz işleçlerdir (operatör * bunlara uygulanamaz). Olarak ilan edilirler

geçersiz * r;

Türü ne olursa olsun, herhangi bir adres geçersiz bir işaretçiye atanabilir: x türü ne olursa olsun, r = & x her zaman mümkün olacaktır.


Cevap 5:

Buraya “fazla değil” yazmak üzereydim, ancak Ernesto Bascón Pantoja kesinlikle haklı. C'ye bir işaretçi de yazılmıştır, yani “int” işaretçisi, “char” işaretçisi ya da kendi yaptığınız yapıdan farklıdır.

Yani bir bellek adresinin bir sokak adresiyle karşılaştırılabilmesi açısından, bir işaretçi adresi, aynı zamanda adres türünü de içerir, yani bir ev mi? Bir apartman? Bir Domino bayisi mi?

Hafıza adresi sadece budur, hafızadaki bir adres, ama o adreste gerçekte hangi verinin olduğunu bilen.

İşaretçi bellek adresidir, ancak orada ne tür verilerin beklendiğini de bilir.

C'de de, orada ne tür veriler bekleyeceğiniz hakkında bilgi içermeyen bir geçersiz işaretçi de olabilir.


Cevap 6:

Bellek adresi, işletim sistemi tarafından, verilerin yazılabileceği veya okunabileceği bir bellek konumu anlamına gelen bir sayıdır.

C ve C ++ 'da bir işaretçi, bir bellek adresini saklayan bir değişkendir ve ayrıca depolanan bellek adresiyle belirtilen bellek konumunda saklanması gereken veri türü bilgisini içerir.


Cevap 7:

İşaretçi aynı zamanda başka bir bellek adresine işaret eden ve dolayısıyla POINTER olarak adlandırılan bir bellek adresidir.

Bir bellek adresi veri içeriyorsa (başka bir bellek adresi değil), buna DEĞİŞKEN veya SABİT denebilir.

Bununla birlikte, bir POINTER değerini değiştirebildiğimizden, bir işaretçi duruma göre bir POINTER DEĞİŞKEN veya POINTER SABİT olarak adlandırılabilir.