Video: Array 2 Dimensi, Pointer, dan Struktur bahasa C. Modul VI 2024
Nama array adalah penunjuk kepada array itu sendiri. Arahan adalah urutan pembolehubah yang disimpan dalam memori. Nama array array menunjukkan item pertama.
Ini adalah soalan yang menarik tentang petunjuk: Bolehkah anda mempunyai tajuk fungsi, seperti baris berikut, dan hanya gunakan sizeof untuk menentukan berapa banyak elemen dalam array? Jika ya, fungsi ini tidak perlu mempunyai pemanggil menentukan saiz array.
int AddUp (int Numbers []) {
Perhatikan fungsi ini yang terdapat dalam contoh Array01 dan utama () yang memanggilnya:
Apabila anda menjalankan aplikasi ini, inilah yang anda lihat:
Di luar fungsi, kod itu mengetahui bahawa saiz array ialah 40 bait. Tetapi mengapa kod tersebut berfikir bahawa saiznya adalah 4 selepas ia berada di dalam array? Alasannya adalah bahawa walaupun kelihatan bahawa anda sedang melewati array, anda benar-benar melewati
penunjuk pada array. Saiz penunjuk hanya 4, dan begitulah cetakan baris cout muktamad.
int MyNumbers [5];
pengkompil tahu bahawa anda mempunyai tatasusunan, dan operator sizeof memberikan saiz array keseluruhan. Nama array, maka,
kedua penuding dan array! Tetapi jika anda mengisytiharkan tajuk fungsi tanpa saiz array, seperti void ProcessArray (int Numbers []) {
compiler merawat ini sebagai hanya
pointer dan tidak lebih. Garis akhir ini, sebenarnya, bersamaan dengan baris berikut: void ProcessArray (Int * Numbers) {
Oleh itu, di dalam fungsi yang sama ada baris mengisytiharkan, dua baris kod berikut
: Bilangan [3] = 10; * (Bilangan + 3) = 10; Kesamaan ini bermakna bahawa jika anda menggunakan perisytiharan ekstern pada array, seperti
extern int MyNumbers [];
dan kemudian mengambil saiz array ini, pengkompil akan keliru. Contohnya: Jika anda mempunyai dua fail, nombor. cpp dan utama. cpp, di mana nombor. cpp mengisytiharkan pelbagai dan utama. cpp mengeluarkannya secara eksternal (seperti yang ditunjukkan dalam contoh Array02), anda akan mendapat ralat pengompil jika anda memanggil sizeof:
# include menggunakan namespace std; extern int MyNumbers []; int main (int argc, char * argv []) {cout << sizeof (MyNumbers) << endl; kembali 0;}
Dalam Kod:: Blok, pengkompil gcc memberi kami ralat ini: ralat
: permohonan tidak sah 'sizeof' kepada jenis tidak lengkap int [] '
daripada pelbagai di dalam kurungan.Pastikan saiznya sama seperti fail fail sumber lain! Anda boleh mengeluarkan penyusun dengan menukar nombor, dan anda
tidak akan mendapat ralat
. Tetapi itu adalah gaya pengaturcaraan yang buruk dan hanya meminta kesilapan. Walaupun satu array
adalah sekadar satu pemboleh ubah yang bersebelahan antara satu sama lain dalam ingatan, nama suatu tatasusunan sebenarnya hanya penuding ke elemen pertama dalam array. Anda boleh menggunakan nama itu sebagai penunjuk. Walau bagaimanapun, lakukan hanya apabila anda benar-benar perlu bekerja dengan penuding. Lagipun, anda tidak mempunyai sebab untuk menulis kod yang samar, seperti * (Bilangan + 3) = 10;. Perbualan juga benar. Lihat fungsi ini: void ProcessArray (int * Bilangan) {cout << numbers [1] << endl;}
Fungsi ini mengambil penunjuk sebagai parameter, namun anda mengaksesnya sebagai array. Sekali lagi, jangan tulis kod seperti ini; Sebaliknya, anda harus memahami
mengapa kod seperti ini berfungsi
. Dengan cara itu, anda mendapat pengetahuan yang lebih mendalam mengenai tatasusunan dan bagaimana mereka tinggal di dalam komputer, dan pengetahuan ini pula dapat membantu anda menulis kod yang berfungsi dengan baik. Walaupun nama array hanya penunjuk, nama array integer bukanlah perkara yang sama seperti penuding ke integer. Lihat baris ini kod (didapati dalam contoh Array03): int LotsONumbers [50]; int x; LotsONumbers = & x;
Point the LotsONumbers
pointer
ke sesuatu yang berbeza: sesuatu yang diisytiharkan sebagai integer. Pengkompil tidak membenarkan anda melakukan ini; anda mendapat ralat. Itu tidak akan berlaku jika LotsONumbers diisytiharkan sebagai int * LotsONumbers; maka kod ini akan berfungsi. Tetapi seperti yang tertulis, kod ini memberikan anda ralat pengkompil. Dan percayalah atau tidak, inilah ralat pengomputer yang anda dapatkan dalam Kod:: Blok: ralat: jenis yang tidak serasi dalam tugasan 'int *' ke 'int [50]' Kesalahan ini menunjukkan compiler melihat perbezaan yang jelas antara kedua-dua jenis, int * dan int []. Walau bagaimanapun, nama array sememangnya penunjuk, dan anda boleh menggunakannya sebagai satu; anda tidak boleh melakukan segala-galanya dengannya yang anda boleh dengan penuding biasa, seperti menetapkan semula itu.
Apabila menggunakan tatasusunan, maka ambil perhatian petua berikut. Ini akan membantu anda membuat tatasusunan anda bebas-bug:
Pastikan kod anda konsisten. Jika anda mengisytiharkan, contohnya, penuding ke integer, jangan menganggapnya sebagai array.
Pastikan kod anda jelas dan difahami. Sekiranya anda melewati penunjuk, tidak mengapa untuk mengambil alamat elemen pertama, seperti dalam & (MyNumbers [0]) jika ini menjadikan kod itu lebih jelas - walaupun bersamaan dengan hanya MyNumbers.
-
Apabila anda mengisytiharkan pelbagai, sentiasa cuba memasukkan nombor di dalam kurungan, melainkan anda menulis fungsi yang mengambil array.
-
Apabila anda menggunakan kata kunci ekstern untuk mengisytiharkan array, teruskan dan masukkan saiz seragam di dalam kurungan. Tetapi konsisten! Jangan gunakan nombor satu kali dan nombor yang berbeza masa lain. Cara paling mudah untuk menjadi konsisten ialah menggunakan pemalar, seperti int int ArraySize = 10; dalam fail header umum dan kemudian gunakan dalam pernyataan array anda: int MyArray [ArraySize];.