Bir işaretçiye 1 eklediğinizde, sonuç bir sonraki nesnenin sivri uçlu tipteki nesneler dizisindeki (yani bir dizi) konumudur. Eğer p
bir noktalarından int
nesne, daha sonra p + 1
bir sonraki işaret eder int
bir sırayla. Eğer p
bir 5-eleman dizisine noktası int
(bu durumda, ifade &a
), daha sonra p + 1
bir sonraki işaret eder , 5-elemanlı bir dizininint
bir sırayla.
İki işaretçi çıkarmak (her ikisi de aynı dizi nesnesine işaret ediyorsa veya biri dizinin son öğesinin ötesine işaret ediyorsa) bu iki işaretçi arasındaki nesne sayısını (dizi öğeleri) verir.
İfade &a
, adresini verir ve a
türüne sahiptir int (*)[5]
(işaretçi ile 5 öğeli dizi int
). Sentezleme &a + 1
sonraki 5-elemanlı bir dizinin adresi verir int
, aşağıdaki a
ve ayrıca türü vardır int (*)[5]
. İfade *(&a + 1)
, sonucunu, bu bağlamda bir tür ifadesine "çürüten" son elemanın son elemanının &a + 1
adresini verecek ve türe sahip olacak şekilde deregre eder .int
a
int [5]
int *
Benzer şekilde, ifade a
dizinin ilk öğesine bir göstergeye "bozulur" ve türü vardır int *
.
Bir resim yardımcı olabilir:
int [5] int (*)[5] int int *
+---+ +---+
| | <- &a | | <- a
| - | +---+
| | | | <- a + 1
| - | +---+
| | | |
| - | +---+
| | | |
| - | +---+
| | | |
+---+ +---+
| | <- &a + 1 | | <- *(&a + 1)
| - | +---+
| | | |
| - | +---+
| | | |
| - | +---+
| | | |
| - | +---+
| | | |
+---+ +---+
Bu, aynı depolamanın iki görünümüdür - solda, 5 elementli dizilerin int
bir dizisi olarak görüyoruz, sağda ise bir dizisi olarak görüyoruz int
. Ayrıca çeşitli ifadeleri ve türlerini de gösteriyorum.
Unutmayın, ifade tanımsız davranışla*(&a + 1)
sonuçlanır :
...
Eğer sonuç dizi nesnesinin son elemanını geçerse, değerlendirilen tekli * işlecinin işleneni olarak kullanılmamalıdır.
C 2011 Çevrimiçi Taslak , 6.5.6 / 9
&a + 1
geçerli bir nesneye işaret etmiyor, bu yüzden geçersiz.