Untuk memahami peretasan ini, pertama-tama Anda perlu memahami perbedaan penunjuk, yaitu apa yang terjadi jika dua penunjuk yang menunjuk ke elemen array yang sama dikurangi?
Ketika satu pointer dikurangi dari yang lain, 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 dengan i - j
.
C11: 6.5.6 Operator aditif (p9):
Ketika dua pointer dikurangi, keduanya akan menunjuk ke elemen objek array yang sama, atau yang melewati elemen terakhir objek array; hasilnya adalah selisih subskrip kedua elemen array. [...].
Dengan kata lain, jika ekspresi P
dan Q
masing-masing menunjuk ke elemen ke-9_ dan ke-j
dari objek array, ekspresi (P)-(Q)
memiliki nilai i−j
kuat> asalkan nilainya cocok dengan objek bertipe ptrdiff_t
.
Sekarang saya berharap Anda mengetahui konversi nama array menjadi pointer, a
mengkonversi ke pointer ke elemen pertama array a
. &a
adalah alamat seluruh blok memori, yaitu alamat array a
. Gambar di bawah akan membantu Anda memahami (baca jawaban ini untuk penjelasan detail):
Ini akan membantu Anda memahami mengapa a
dan &a
memiliki alamat yang sama dan bagaimana (&a)[i]
merupakan alamat 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 yang masing-masing berisi n
int
elemen. Oleh karena itu, total elemen array adalah n*n
= n
2.
CATATAN:
C11: 6.5.6 Operator aditif (p9):
Ketika dua pointer dikurangi, keduanya akan menunjuk ke elemen objek array yang sama, atau yang melewati elemen terakhir objek array; hasilnya adalah selisih subskrip kedua elemen array. Ukuran hasilnya ditentukan oleh implementasi, dan tipenya (tipe bilangan bulat bertanda) adalah ptrdiff_t
yang ditentukan dalam header <stddef.h>
. Jika hasilnya tidak dapat direpresentasikan dalam objek bertipe tersebut, perilakunya tidak terdefinisi.
Karena (&a)[n]
tidak menunjuk ke elemen objek array yang sama atau yang melewati elemen terakhir objek array, (&a)[n] - a
akan memunculkan perilaku tidak terdefinisi.
Perhatikan juga bahwa, lebih baik mengubah tipe pengembalian fungsi p
menjadi ptrdiff_t
.
person
haccks
schedule
07.01.2015
int p(n)
? Apakah itu bisa dikompilasi? - person barak manos   schedule 08.01.2015gcc
. - person lurker   schedule 08.01.2015int q(int n) { return sizeof (char [n][n]); }
- person ouah   schedule 08.01.2015sizeof
untuk menyimpan karakter. Yang lainnya: ini adalah kode yang sengaja dikaburkan, perilakunya tidak terdefinisi, jawaban @ouah benar. - person ecatmur   schedule 08.01.2015O(n^2)
untuk menghitungn^2
- person Khaled.K   schedule 14.01.2015