Baris ini yang paling penting:
size = *(&a + 1) - a;
Seperti yang Anda lihat, alamat tersebut mengambil alamat adan menambahkan satu alamat . Kemudian, itu membedakan penunjuk itu dan mengurangi nilai aslinya adarinya.
Aritmatika pointer di C menyebabkan ini mengembalikan jumlah elemen dalam array, atau 5. Menambahkan satu dan &amerupakan penunjuk ke larik berikutnya dari 5 intdetik 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 xyzyang menunjuk ke suatu inttipe dan berisi nilainya (int *)160. Saat Anda mengurangi angka apa pun xyz, C menentukan bahwa jumlah sebenarnya yang dikurangi xyzadalah angka tersebut dikalikan ukuran jenis yang dituju. Misalnya, jika Anda dikurangi 5dari xyz, nilai xyzyang dihasilkan akan xyz - (sizeof(*xyz) * 5)jika aritmetik pointer tidak berlaku.
Seperti aarray 5 inttipe, 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 adari &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 + 1tidak menunjuk ke objek yang valid, jadi tidak valid.