Bu hack'i anlamak için, önce işaretçi farkını anlamalısınız, yani, aynı dizinin öğelerini işaret eden iki işaretçi çıkarıldığında ne olur ?
Bir işaretçi diğerinden çıkarıldığında, sonuç işaretçiler arasındaki mesafedir (dizi öğelerinde ölçülür). Yani, eğer pişaret eder a[i]ve qişaret ederse a[j], o p - qzaman eşittiri - j .
C11: 6.5.6 Katkı operatörleri (s9):
İki işaretçi çıkarıldığında , her ikisi de aynı dizi nesnesinin öğelerini veya dizi nesnesinin son öğesinin ötesini işaret eder; sonuç, iki dizi öğesinin aboneliklerinin farkıdır . [...].
Başka bir deyişle, ifadeler Pve Qsırasıyla bir dizi nesnesinin i-th ve j-th öğelerini gösteriyorsa , ifadenin (P)-(Q), değerini−j türdeki bir nesneye uyması koşuluyla değeri olur ptrdiff_t.
Şimdi işaretçi için dizi adı dönüşüm farkında olduğunuzu umuyorum, aişaretçi dizinin ilk öğesine dönüştürür a. &atüm bellek bloğunun adresidir, yani bir dizi adresidir a. Aşağıdaki şekil anlamanıza yardımcı olacaktır ( ayrıntılı açıklama için bu cevabı okuyun ):

Bu, neden ave &aaynı adrese ve (&a)[i]i th dizisinin adresinin (adresiyle aynı boyutta a) nasıl olduğunu anlamanıza yardımcı olacaktır .
Yani, açıklama
return (&a)[n] - a;
eşittir
return (&a)[n] - (&a)[0];
ve bu fark işaretçiler arasındaki (&a)[n]ve her bir elemanın dizisi (&a)[0]olan elemanların sayısını verecektir . Bu nedenle, toplam dizi elemanları = 2'dir . nn intn*nn
NOT:
C11: 6.5.6 Katkı operatörleri (s9):
İki işaretçi çıkarıldığında, her ikisi de aynı dizi nesnesinin öğelerini veya dizi nesnesinin son öğesinin ötesini işaret eder ; sonuç, iki dizi öğesinin aboneliklerinin farkıdır. Sonucun boyutu uygulama tanımlıdır ve türü (işaretli bir tamsayı türü) başlıkta ptrdiff_ttanımlanır <stddef.h>. Sonuç bu tür bir nesnede gösterilemiyorsa, davranış tanımsızdır.
Bu yana (&a)[n]bir dizi objenin son öğe geçen aynı dizi nesne veya bir elemanlarına de nokta, (&a)[n] - aaçılmasına neden olur tanımsız davranış .
Ayrıca işlevin dönüş türünü değiştirmek için daha iyi, dikkat petmek ptrdiff_t.