Rumah Keuangan Pribadi Array dan Pointer di C ++ - dummies

Array dan Pointer di C ++ - dummies

Video: Array, struct, dan Pointer (Hitung nilai mahasiswa) 2024

Video: Array, struct, dan Pointer (Hitung nilai mahasiswa) 2024
Anonim

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];.

Array dan Pointer di C ++ - dummies

Pilihan Editor

Bertahan dalam Zombie Sieges di Minecraft - dummies

Bertahan dalam Zombie Sieges di Minecraft - dummies

Bermasalah dengan zombie yang menyerang desa Anda pada malam hari di Minecraft? Pelajari bagaimana untuk membela diri, menyembuhkan penduduk desa zombie, dan pulihkan dunia Anda!

Zaman Batu di Minecraft - dummies

Zaman Batu di Minecraft - dummies

Tonggak penting dalam mode Minecraft Survival, dan yang dicapai oleh beberapa pemain di Hari pertama, mencapai Zaman Batu. Setelah Anda membuat pickax kayu dan Anda bisa menemukan gua atau menggali lubang, item dalam tabel berikut tersedia untuk Anda. Sebagian besar bahan berbasis batu lebih padat dari yang lain ...

Zaman Looting di Minecraft - dummies

Zaman Looting di Minecraft - dummies

Anda mencapai Usia Looting di Minecraft di awal permainan - kadang-kadang, bahkan paralel untuk mencapai Era Kayu. Anda mulai dengan membunuh musuh untuk menjarah, dan dengan menggunakan jarahan untuk memperbaiki repertoar kerajinan Anda. Lebih banyak item kemudian tersedia bagi Anda, seperti tercantum dalam tabel. Semua alat meningkatkan jumlah ...

Pilihan Editor

Infografis tepat waktu: Berbagi Breaking News - dummies

Infografis tepat waktu: Berbagi Breaking News - dummies

Walaupun infografik Anda tidak mungkin menjadi satu-satunya sumber berita, Ini bisa membantu pemahaman pembaca akan sebuah acara berita. Misalnya, banyak orang belajar di Twitter pada bulan Oktober, 2011 bahwa pendiri Apple Steve Jobs telah meninggal dunia. Infografis tidak akan menjadi orang pertama yang mendengarnya. Tapi orang-orang ...

Pilihan Editor

GED Contoh Pertanyaan: Pertanyaan Ilmu Fisik - dummies

GED Contoh Pertanyaan: Pertanyaan Ilmu Fisik - dummies

Ketika Anda mencapai bagian Sains GED, Anda akan diharapkan memiliki pengetahuan umum di semua cabang Ilmu Pengetahuan, termasuk Ilmu Fisika. Berikut adalah contoh jenis pertanyaan yang mungkin Anda hadapi pada hari ujian. Kecepatan dan Kecepatan Ada perbedaan antara kecepatan dan kecepatan, meskipun terkadang Anda ...

Latihan GED RLA: Reading Comprehension - dummies

Latihan GED RLA: Reading Comprehension - dummies

Cara terbaik untuk mempersiapkan bagian pemahaman bacaan GED Tes RLA adalah melakukan sebanyak mungkin pertanyaan latihan. Simak sampel untuk melihat apa yang akan Anda hadapi pada hari ujian. Contoh Pertanyaan Pertanyaan 1-6 mengacu pada bagian berikut. Fasilitas untuk Akses ke Perusahaan Kreatif (FACE) Awalnya didirikan ...

GED Penalaran melalui Latihan Keterampilan Membaca Bahasa Seni - dummies

GED Penalaran melalui Latihan Keterampilan Membaca Bahasa Seni - dummies

Komponen bacaan Penalaran meskipun Bahasa Seni Bagian pada GED terdiri dari kutipan dari fiksi dan nonfiksi. Setiap kutipan diikuti oleh beberapa item pilihan berdasarkan bahan bacaan. Untuk pertanyaan di bagian ini, pilih satu jawaban terbaik untuk setiap pertanyaan. Bekerja dengan hati-hati, tapi jangan terlalu banyak menghabiskan waktu ...