2009-04-17 27 views
12

Aşağıdaki kod parçasını göz önünde ilk baskı q artan 12'deişaretçi Aritmetik C

içinde onu daha da büyüttü Ama ikinci baskı beni şaşırtıyor mu yani '12, 0' olduğunu beni şaşırtıyor etmez. 1 yazdırır!
Peki neden 12 yerine 1 yazdı? sadece beni şaşırtıyor.

cevap

27

++ artım işleci gibi, işaretçilerle birlikte - çıkarma işleci de işaret edilen nesnelerin boyutunu dikkate alır. Özellikle, döndürülen sonuç, işaretçi değerleri bayt farkının, sivri nesnenin boyutuna bölünmesiyle elde edilen sayıdır (örneğinizde 12). Bu nedenle fark 12 ya da 12'ye bölünmüş 12 bayttır.

+0

İki göstergeyi almanın ve farklarını bayt olarak almanın bir yolu yok mu? –

+8

İşaretçileri (char *) olarak işaretledikten sonra farkı bayt cinsinden alırsınız. –

+4

@Leif: Ya ​​sadece farkı sizeof (your_type) ile çarpın. –

4

Farkı gerçekten bilmek isterseniz, her bir işaretçiyi bir (char *) 'a ve sonra (int)' ye ve sonra da çıkartabilirsiniz. Bu size cevabı vermeli.

Bu kod size mutlak değerini verir:

printf("%d\n", abs((int)((char*)q) - (int)((char*)p))); 

math.h. eklemeyi unutmayın

Düzeltme: Bir yorumda belirtildiği gibi, bir çift döküm gerekmez. Her bir işaretçiyi bir int ve daha sonra çıkartmak, yukarıdaki (gereksiz) çift döküm ile aynı cevabı verir.

printf("%d\n", abs((int)(q) - (int)(p))); 
+0

Neden çift döküm? –

+0

Bu, eğer (int) Idelic