2009-06-13 16 views
7

Bir işaretçinin herhangi bir değişkenin adresini sakladığını ... ve sonra işaretçiyi nereden alacağımızı bilmek isterim.İşaretçinin herhangi bir adresi veya bellek ayırması var mı?

Sorduğum şey, doğrudan işaretçi kullanıyorsak, bu işaretçiyi nereden aldığımızdan bir yer olması gerektiğiydi.

yardım edin, ben ... karıştı gettin ediyorum: ((şuna

+0

yeniden etiketlenir sonrası. Yakut? Haydi. –

+1

Buradaki gibi, soru çok zor anlaşılıyor. –

+0

Sorunu oldukça yanıtladı ve birkaç kişi size örnek gösterdi. İhtiyacın olan başka bir şey var mı? –

cevap

10

Evet. ve her birinin bellek adresini yazdırmak için bir int ve kodu gösteren bir işaretçi. İşaretçiler, 32bit sistemlerde 4 bayt alırlar. C

3

:

char *p = "Here I am"; 

p sonra H 'depolanır adresini saklar. p bir değişkendir. Bunun için bir işaretçi alabilir:

char **pp = &p; 

pp şimdi p adresini saklar. pp adresini almak istiyorsanız, bu &pp vb.

26

Evet, bildirilen bir işaretçinin bellekte kendi konumu vardır. Yukarıdaki örnekte

alt text

, değeri "17" saklayan bir değişken, 'b', sahiptir.
int b = 17; /* the value of 'b' is stored at memory location 1462 */ 

Eğer işaretçi kendi hafıza konumu saklanan , yani değişken bir işaretçi oluşturduğunuzda.

int *a; 
a = &b;  /* the pointer 'a' is stored at memory location 874 */ 

Derleyicinin görevi "işaretçiyi nereden aldığını" bilmek. Kaynak kodunuz "a" işaretçisine başvurduğunda, derleyici bunu -> "her hangi bir adres değeri bellek konumuna 874" içinde kaydeder "şeklinde çevirir.

Not: Bu şema teknik olarak doğru değildir, çünkü 32 bit sistemlerde, her iki işaretçi ve int her biri dört bayt kullanır.

+0

NULL alanlarına yönelik işaretçiler nedir? Özellikle özyineli soyut veri tiplerinde. - Bağlantılı listeler hakkında bir şeyler öğreniyorum. Bağlı bir liste etkili bir şekilde sonsuz sayıda işaretçidir (tekrarlayan düğümler). Bunlar hafızaya mı çıkıyor? Ya da boş değerleri belleğe almayın mı? – Federico

1

Derleyici, kodumuzdaki değişkenleri makine yönergelerinde kullanılan bellek konumlarına dönüştürmeyi içerir. İşaretçi değişkeninin yeri kodda bildirildiği yere göre değişir, ancak programcılar genellikle doğrudan bununla uğraşmak zorunda kalmazlar.

Bir işlev içinde bildirilen değişken, yığında veya bir kayıtta (statik olarak belirtilmemişse) yatar.

En üst düzeyde bildirilen bir değişken, programın en üstünde bir bellek bölümünde yaşar.

Dinamik olarak ayrılmış bir yapının veya dizinin parçası olarak bildirilen değişken, yığınta yaşar.

"&" operatörü, değişkenin bellek konumunu döndürür, ancak "*" operatörünün aksine, tekrarlanamaz.

Örneğin, * * * adresindeki değeri alır * * i, i'de saklanan değer olan i * değerindeki değerdir, bu da derleyicinin nasıl bulunacağını belirler.

Ancak & & Derlemem. & i, derleyicinin i. Değişken için kullandığı bellek yeridir. Bu numara herhangi bir yerde saklanmaz, bu nedenle & & i hiçbir anlam ifade etmez.

(yani kaynak kod kullanılır &, daha sonra bir derleyici kayıttaki i depolamak unutmayın.)

İlgili konular