Untuk memahami peretasan ini, pertama-tama Anda perlu memahami perbedaan penunjuk, yaitu, apa yang terjadi jika dua penunjuk yang menunjuk ke elemen larik yang sama dikurangi?
Ketika satu pointer dikurangkan dari pointer lainnya, hasilnya adalah jarak (diukur dalam elemen array) antara pointer. Jadi, jika pmenunjuk ke a[i]dan qmenunjuk ke a[j], maka p - qsama dengani - j .
C11: 6.5.6 Operator aditif (p9):
Ketika dua penunjuk dikurangi , keduanya harus menunjuk ke elemen dari objek larik yang sama, atau satu melewati elemen terakhir dari objek larik; hasilnya adalah perbedaan subskrip dari dua elemen array . [...].
Dengan kata lain, jika ekspresi Pdan Qmenunjuk ke, masing-masing, elemen i-th dan j-th dari sebuah objek array, ekspresi tersebut (P)-(Q)memiliki nilaii−j asalkan nilainya sesuai dengan sebuah objek bertipe ptrdiff_t.
Sekarang saya mengharapkan bahwa Anda mengetahui konversi nama array ke pointer, amengubahnya menjadi pointer ke elemen pertama dari array a. &aadalah alamat seluruh blok memori, yaitu alamat array a. Gambar di bawah ini akan membantu Anda untuk memahami ( baca jawaban ini untuk penjelasan rinci ):

Ini akan membantu Anda untuk memahami mengapa adan &amemiliki alamat yang sama dan bagaimana (&a)[i]alamat dari array ke- i (dengan ukuran yang sama dengan a).
Jadi, pernyataannya
return (&a)[n] - a;
setara dengan
return (&a)[n] - (&a)[0];
dan perbedaan ini akan memberikan jumlah elemen antara pointer (&a)[n]dan (&a)[0], yang merupakan narray setiap n intelemen. Oleh karena itu, total elemen array adalah n*n= n2 .
CATATAN:
C11: 6.5.6 Operator aditif (p9):
Ketika dua penunjuk dikurangi, keduanya harus menunjuk ke elemen dari objek larik yang sama, atau satu melewati elemen terakhir dari objek larik ; hasilnya adalah perbedaan subskrip dari dua elemen array. Ukuran hasil ditentukan oleh implementasi , dan tipenya (tipe integer bertanda) ptrdiff_tditentukan di <stddef.h>header. Jika hasilnya tidak dapat direpresentasikan dalam objek jenis itu, perilaku tidak ditentukan.
Karena (&a)[n]tidak menunjuk ke elemen dari objek array yang sama atau melewati elemen terakhir dari objek array, tidak (&a)[n] - aakan memunculkan perilaku tidak terdefinisi .
Perhatikan juga bahwa, lebih baik untuk mengubah jenis fungsi yang dikembalikan pmenjadi ptrdiff_t.