Video: Array, struct, dan Pointer (Hitung nilai mahasiswa) 2024
Nama array adalah pointer ke array itu sendiri.. array adalah urutan variabel yang tersimpan dalam memori. Nama array menunjuk ke item pertama.
Ini adalah pertanyaan menarik tentang petunjuk: Dapatkah Anda memiliki header fungsi, seperti baris berikut, dan cukup gunakan sizeof untuk menentukan berapa banyak elemen dalam array? Jika demikian, fungsi ini tidak perlu pemanggil menentukan ukuran array.
int AddUp (int Numbers []) {
Pertimbangkan fungsi ini yang ditemukan pada contoh Array01 dan main () yang memanggilnya:
void ProcessArray (int Numbers []) { cout << "di dalam fungsi: Ukuran dalam byte adalah" << sizeof (Bilangan) << endl;} int main (int argc, char * argv []) {int MyNumbers [] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; cout << "fungsi luar: Ukuran dalam bytes adalah"; cout << sizeof (MyNumbers) << endl; ProcessArray (MyNumbers); kembali 0;}
Saat menjalankan aplikasi ini, inilah yang Anda lihat:
Fungsi luar: Ukuran byte adalah 40 Fungsi di dalam: Ukuran dalam byte adalah 4
Di luar fungsinya, kode mengetahui bahwa ukuran array adalah 40 byte. Tapi mengapa kode berpikir bahwa ukurannya adalah 4 setelah berada di dalam array? Alasannya adalah bahwa meskipun tampaknya Anda melewati sebuah array, Anda benar-benar melewati pointer ke sebuah array. Ukuran pointer hanya 4, dan itulah yang dicetak cout akhir.
Mendeklarasikan array memiliki sedikit keistimewaan. Ketika Anda mendeklarasikan sebuah array dengan memberikan sejumlah elemen tertentu, seperti
int MyNumbers [5];
kompilator mengetahui bahwa Anda memiliki sebuah array, dan operator sizeof memberi Anda ukuran keseluruhan array. Nama array, kemudian, adalah dua pointer dan sebuah array! Tapi jika Anda mendeklarasikan header fungsi tanpa ukuran array, seperti
void ProcessArray (int Numbers []) {
compiler memperlakukan ini hanya sebagai pointer dan tidak lebih dari itu. Baris terakhir ini, sebenarnya sama dengan baris berikut:
void ProcessArray (int * Bilangan) {
Jadi, di dalam fungsi yang ditunjukkan oleh kedua baris, dua baris kode berikut setara <: Angka [3] = 10; * (Angka + 3) = 10;
Kesetaraan ini berarti bahwa jika Anda menggunakan deklarasi extern pada sebuah array, seperti
extern int MyNumbers [];
dan kemudian mengambil ukuran dari array ini, compiler akan menjadi bingung. Inilah contohnya: Jika Anda memiliki dua file, angka. cpp dan main cpp, di mana angka cpp mendeklarasikan sebuah array dan main. cpp secara eksternal menyatakannya (seperti yang ditunjukkan pada contoh Array02), Anda akan mendapatkan kesalahan kompilator jika Anda memanggil sizeof:
#include using namespace std; extern int MyNumbers []; int main (int argc, char * argv []) {cout << sizeof (MyNumbers) << endl; return 0;}
In Code:: Blocks, compiler gcc memberi kita kesalahan ini:
error: aplikasi yang tidak valid 'sizeof' ke tipe incomplete 'int []'
Solusinya adalah dengan meletakkan ukuran dari array di dalam kurung.Pastikan ukurannya sama seperti pada file kode sumber lainnya! Anda bisa memalsukan kompilator dengan mengganti nomornya, dan
Anda tidak akan mendapatkan error . Tapi itu gaya pemrograman yang buruk dan hanya meminta kesalahan. Meskipun
array hanyalah sekumpulan variabel yang berdekatan satu sama lain dalam memori, nama dari sebuah array benar-benar hanya sebuah pointer ke elemen pertama dalam array. Anda bisa menggunakan nama sebagai pointer. Namun, lakukan itu hanya bila Anda benar-benar perlu bekerja dengan pointer. Setelah semua, Anda benar-benar tidak memiliki alasan untuk menulis kode yang samar, seperti * (Bilangan + 3) = 10;. Kebalikannya juga benar. Lihatlah fungsi ini:
void ProcessArray (int * Numbers) {cout << numbers [1] << endl;}
Fungsi ini mengambil pointer sebagai parameter, namun Anda mengaksesnya sebagai array. Sekali lagi, jangan menulis kode seperti ini; Sebagai gantinya, Anda harus mengerti
mengapa kode seperti ini bekerja . Dengan begitu, Anda mendapatkan pengetahuan tentang array yang lebih dalam dan bagaimana mereka tinggal di dalam komputer, dan pengetahuan ini, pada gilirannya, dapat membantu Anda menulis kode yang sesuai. Meskipun, nama array hanyalah sebuah penunjuk, nama dari array bilangan bulat bukanlah hal yang sama persis dengan pointer ke integer. Lihat baris kode ini (temukan di contoh Array03):
int Lotsonumbers [50]; int x; Lotsonumbers = & x;
Arahkan angka loton
ke sesuatu yang berbeda: sesuatu dinyatakan sebagai bilangan bulat. Kompilator tidak membiarkan Anda melakukan ini; kamu mendapat error Itu tidak akan terjadi jika banyak orang dinyatakan sebagai int * Lotsons; maka kode ini akan berhasil. Tapi seperti ditulis, kode ini memberi Anda kesalahan kompilator. Dan percayalah atau tidak, inilah kesalahan kompilator yang Anda dapatkan di Code:: Blocks: error: tipe yang tidak kompatibel dalam penugasan 'int *' ke 'int [50]' Kesalahan ini menyiratkan kompilator tidak melihat Perbedaan yang pasti antara dua tipe, int * dan int []. Namun demikian, nama array memang pointer, dan Anda bisa menggunakannya sebagai satu; Anda tidak bisa melakukan semuanya dengan itu yang bisa Anda lakukan dengan pointer normal, seperti menugaskannya kembali.
Bila menggunakan array, perhatikan tip berikut. Ini akan membantu Anda menjaga bug bebas bug Anda:
Jaga agar kode Anda tetap konsisten. Jika Anda menyatakan, misalnya, pointer ke integer, jangan memperlakukannya sebagai array.
Jaga agar kode Anda jelas dan mudah dipahami. Jika Anda melewatkan petunjuk, tidak masalah untuk mengambil alamat elemen pertama, seperti di & (MyNumbers [0]) jika kode ini lebih jelas - meskipun hanya setara dengan MyNumbers.
-
Bila Anda mendeklarasikan sebuah array, selalu mencoba memasukkan nomor di dalam kurung, kecuali jika Anda menulis sebuah fungsi yang membutuhkan sebuah array.
-
Bila Anda menggunakan kata kunci extern untuk mendeklarasikan sebuah array, maju dan juga letakkan ukuran array di dalam tanda kurung. Tapi konsisten! Jangan gunakan satu nomor satu kali dan nomor yang berbeda lain kali. Cara termudah untuk konsisten adalah dengan menggunakan konstanta, seperti const int ArraySize = 10; dalam file header yang umum dan kemudian menggunakannya dalam deklarasi array Anda: int MyArray [ArraySize];.