Jika ekspresi type name[count]
ditulis dalam beberapa fungsi maka Anda memberi tahu kompiler C untuk mengalokasikan pada sizeof(type)*count
byte frame tumpukan dan menghitung alamat elemen pertama dalam array.
Jika ekspresi type name[count]
ditulis di luar semua definisi fungsi dan struct maka Anda memberi tahu kompiler C untuk mengalokasikan pada sizeof(type)*count
byte segmen data dan menghitung alamat elemen pertama dalam array.
name
sebenarnya adalah objek konstan yang menyimpan alamat elemen pertama dalam array dan setiap objek yang menyimpan alamat dari beberapa memori disebut pointer, jadi ini adalah alasan Anda memperlakukan name
sebagai pointer daripada array. Perhatikan bahwa array dalam C hanya dapat diakses melalui pointer.
Jika count
adalah ekspresi konstan yang mengevaluasi ke nol maka Anda memberitahu kompiler C untuk mengalokasikan nol byte baik pada frame stack atau segmen data dan mengembalikan alamat elemen pertama dalam array, tetapi masalah dalam melakukan ini adalah bahwa elemen pertama dari array nol panjang tidak ada dan Anda tidak dapat menghitung alamat dari sesuatu yang tidak ada.
Ini rasional bahwa elemen no. count+1
tidak ada dalam count
array -length, jadi ini adalah alasan bahwa kompiler C melarang untuk mendefinisikan array zero-length sebagai variabel di dalam dan di luar fungsi, karena apa isi dari name
itu? Alamat name
toko apa sebenarnya?
Jika p
adalah pointer maka ekspresi p[n]
sama dengan*(p + n)
Di mana tanda bintang * dalam ekspresi kanan adalah operasi dereferensi penunjuk, yang berarti mengakses memori yang ditunjuk oleh p + n
atau mengakses memori yang alamatnya disimpan p + n
, di mana p + n
penunjuk ekspresi, ia mengambil alamat p
dan menambahkan ke alamat ini nomor, n
kalikan dengan ukuran dari jenis pointer p
.
Apakah mungkin menambahkan alamat dan nomor?
Ya itu mungkin, karena alamat adalah bilangan bulat unsigned yang biasanya ditampilkan dalam notasi heksadesimal.