Saya baru saja mulai belajar memprogram dalam C, dan untuk meningkatkan pemahaman saya tentang pointer dan array, saya mencoba merujuk pada elemen-elemen dari array tanpa membuat pointer sama sekali:
for(k1 = 0; k1 < ROW; k1++){
for(k2 = 0; k2 < COLUMN; k2++){
array[k1][k2] = k1*COLUMN + k2 + 1;
printf("[%d][%d] = %d\n", k1, k2, *(array[k1] + k2));
}
}
Seluruh kode mengkompilasi dan berjalan dengan sempurna.
Saya membayangkan harus membuat pointer untuk setiap larik tunggal dalam kode sumber besar tampaknya sangat tidak efisien.
Jadi, daripada memiliki alamat array yang disimpan dan diambil dengan menggunakan pointer, apakah itu praktik pemrograman yang buruk untuk menggunakan alamat array secara langsung, seperti yang ditunjukkan di atas?
programming-practices
c
Niko Gambt
sumber
sumber
printf "[%d][%d] = %d\n", k1, k2, array[k1] [k2]));
akan menghindari pointer aritmik dan lebih mudah dimengerti.Jawaban:
"Buruk" hanya sebatas yang kurang bisa dibaca.
a[x]
adalah hal yang sama dengan*(a+x)
, jadi tidak ada perbedaan dalam efisiensi atau perilaku (pada kenyataannya,x[a]
juga akan berhasil). Hanya sajaa[x]
biasanya jauh lebih intuitif bagi kita manusia.Tapi bukan berarti keterbacaan bukan masalah besar. Untuk melihat seberapa besar, pikirkan bagaimana Anda akan "membaca" dua ekspresi ini jika Anda melihatnya dalam kode:
*(a+x)
= "Benda yang ditunjukkan oleh jumlah pointera
dan integerx
"a[x]
= "x
Anggota array yang ke-a
"Demikian pula, ketika Anda perlu merujuk ke alamat elemen array:
(a+x)
= "Jumlah pointera
dan integerx
"&a[x]
= "Alamatx
anggota array yang ke-a
"Sebagian besar waktu,
[]
versi hanya lebih mudah dipahami ketika Anda melihat kode non-sepele yang beroperasi pada beberapa array yang berbeda (terutama array array). Itu sebabnya[]
operator ada di tempat pertama.PS Melakukan hal semacam ini secara ketat sebagai latihan belajar adalah ide yang sangat bagus. Sangat penting untuk memahami bahwa array benar-benar hanya pointer dan offset.
sumber
Ya, ini praktik buruk, tetapi bukan karena alasan ketidakefisienan.
Operator array menggunakan arithmetric pointer di bawah kap, jadi keduanya sama-sama efisien.
Masalah dengan pointer arithmetric adalah sangat rentan kesalahan dan sulit dibaca.
Rule of thumb: Jangan gunakan pointer arithmetric kecuali Anda harus.
sumber
Dinginkan pembelajaran Anda c, Anda baru saja menemukan salah satu dari twister lidah c. Anda tidak melakukan aritmatika pointer pada array, tetapi array pointer. Melakukan aritmatika pointer pada array tidak dimungkinkan. Array meluruh ke pointer tetapi bukan tipe pointer itu sendiri. Apa yang Anda miliki (lihat komentar oleh cmaster) adalah
Dereferencing pointer ini memberikan nilai pointer Anda yang baru dihitung, menunjuk ke. Biasanya tidak ada gunanya melakukan apa yang Anda lakukan. Tetapi Anda dapat membuat linear array dan kemudian melangkah di dalamnya, seperti ini.
Langkahnya adalah x_dim. Semoga jawaban saya jelas!
sumber
int* array[ROW];
anint array[ROW][COLUMN];
, atauint (*array)[COLUMN];
. Salah satu dari tiga definisi ini dapat digunakan dengan kode dalam OP.