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 p
menunjuk ke a[i]
dan q
menunjuk ke a[j]
, maka p - q
sama 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 P
dan Q
menunjuk 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, a
mengubahnya menjadi pointer ke elemen pertama dari array a
. &a
adalah 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 a
dan &a
memiliki 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 n
array setiap n
int
elemen. Oleh karena itu, total elemen array adalah n*n
= n
2 .
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_t
ditentukan 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] - a
akan memunculkan perilaku tidak terdefinisi .
Perhatikan juga bahwa, lebih baik untuk mengubah jenis fungsi yang dikembalikan p
menjadi ptrdiff_t
.