Baris ini yang paling penting:
size = *(&a + 1) - a;
Seperti yang Anda lihat, alamat tersebut mengambil alamat a
dan menambahkan satu alamat . Kemudian, itu membedakan penunjuk itu dan mengurangi nilai aslinya a
darinya.
Aritmatika pointer di C menyebabkan ini mengembalikan jumlah elemen dalam array, atau 5
. Menambahkan satu dan &a
merupakan penunjuk ke larik berikutnya dari 5 int
detik setelahnya a
. Setelah itu, kode ini membedakan pointer yang dihasilkan dan mengurangi a
(tipe array yang telah meluruh menjadi pointer) dari itu, memberikan jumlah elemen dalam array.
Detail tentang cara kerja aritmatika penunjuk:
Katakanlah Anda memiliki penunjuk xyz
yang menunjuk ke suatu int
tipe dan berisi nilainya (int *)160
. Saat Anda mengurangi angka apa pun xyz
, C menentukan bahwa jumlah sebenarnya yang dikurangi xyz
adalah angka tersebut dikalikan ukuran jenis yang dituju. Misalnya, jika Anda dikurangi 5
dari xyz
, nilai xyz
yang dihasilkan akan xyz - (sizeof(*xyz) * 5)
jika aritmetik pointer tidak berlaku.
Seperti a
array 5
int
tipe, nilai yang dihasilkan adalah 5. Namun, ini tidak akan bekerja dengan pointer, hanya dengan array. Jika Anda mencoba ini dengan penunjuk, hasilnya akan selalu seperti ini 1
.
Berikut adalah contoh kecil yang menunjukkan alamat dan bagaimana ini tidak ditentukan. Sisi kiri menunjukkan alamat:
a + 0 | [a[0]] | &a points to this
a + 1 | [a[1]]
a + 2 | [a[2]]
a + 3 | [a[3]]
a + 4 | [a[4]] | end of array
a + 5 | [a[5]] | &a+1 points to this; accessing past array when dereferenced
Ini berarti bahwa kode tersebut mengurangkan a
dari &a[5]
(atau a+5
), memberikan 5
.
Perhatikan bahwa ini adalah perilaku yang tidak ditentukan, dan tidak boleh digunakan dalam keadaan apa pun. Jangan berharap perilaku ini konsisten di semua platform, dan jangan menggunakannya dalam program produksi.
&a + 1
tidak menunjuk ke objek yang valid, jadi tidak valid.