Rumah Kewangan Peribadi Array dan penunjuk dalam C ++ - dummies

Array dan penunjuk dalam C ++ - dummies

Video: Array 2 Dimensi, Pointer, dan Struktur bahasa C. Modul VI 2024

Video: Array 2 Dimensi, Pointer, dan Struktur bahasa C. Modul VI 2024
Anonim

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: (int argc, char * argv []) {int MyNumbers [] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; cout << "fungsi luar: Saiz dalam bait adalah"; cout << sizeof (MyNumbers) << endl; ProcessArray (MyNumbers); kembali 0;}

Apabila anda menjalankan aplikasi ini, inilah yang anda lihat:

Fungsi di luar: Saiz dalam bait ialah 40 Fungsi dalam: Saiz dalam bait adalah 4
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.

Pengisytiharan tatasusunan mempunyai sedikit idiosincrasy. Apabila anda mengisytiharkan tatasusunan dengan memberikan bilangan pasti elemen, seperti

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

Array dan penunjuk dalam C ++ - dummies

Pilihan Editor

Meningkatkan Rancangan Navigasi Blog - dummies

Meningkatkan Rancangan Navigasi Blog - dummies

Reka bentuk navigasi hebat untuk blog anda meningkatkan pengalaman pembaca. Reka bentuk navigasi buruk di blog mengecewakan pengunjung yang ingin mencari catatan blog tertentu dengan cepat, atau membaca siaran berkaitan atau yang serupa. Mengharapkan keperluan pelawat anda dengan memikirkan blog anda seperti kedai, dan jawatan blog anda seperti produk: Catatan popular dan terkini: ...

Meningkatkan Pengalaman Pengguna Blog dengan Plugin - dummies

Meningkatkan Pengalaman Pengguna Blog dengan Plugin - dummies

Beberapa teknologi yang berbeza dapat meningkatkan blog anda . Plug-in, widget, dan alat semua membuat ciri-ciri baru, integrasi, dan penambahan mudah untuk dibungkus dan diedarkan. Teknologi-teknologi ini berkembang sepanjang masa, tetapi untuk mendapatkan blog anda dan berjalan, berikut adalah beberapa pilihan terbaik semasa untuk pelbagai tujuan. Widget / Name Plugin ...

Meningkatkan Tajuk Blog Anda dan Reka Bentuk Tagline untuk SEO - patung

Meningkatkan Tajuk Blog Anda dan Reka Bentuk Tagline untuk SEO - patung

Tag tajuk blog anda dan tagline memberi enjin carian penerangan kandungan blog anda. Reka bentuk blog SEO yang berkesan bermakna memastikan jawatan blog enjin carian yang layak dan halaman mempunyai tag tajuk mereka sendiri dan bahawa slogan setiap halaman penuh dengan kata kunci yang berkaitan.

Pilihan Editor

Office 2013 Save As Dialog Box - dummies

Office 2013 Save As Dialog Box - dummies

Office 2013 menggunakan SkyDrive pengguna Windows semasa sebagai penyimpanan default lokasi. SkyDrive adalah kawasan penyimpanan dalam talian berasaskan awan yang dihoskan oleh Microsoft. Sesiapa yang mendaftarkan perkhidmatan, atau yang log masuk ke Windows 8 dengan Microsoft ID, diberikan sejumlah ruang penyimpanan percuma, dan boleh membeli lebih banyak. Cloud adalah ...

Unclutter Peti Masuk Outlook anda dengan Clutter - dummies

Unclutter Peti Masuk Outlook anda dengan Clutter - dummies

Mahu aplikasi e-mel yang juga pembaca minda? Keinginan anda diberikan. Anda boleh mengucapkan terima kasih kepada Graph Office dan Clutter, ciri baru dalam Outlook. Clutter menggunakan teknologi di sebalik Grafik Pejabat untuk menganalisis isyarat yang anda hantar apabila anda mengambil tindakan terhadap e-mel anda. Sebagai contoh, jika anda cenderung untuk mengabaikan e-mel daripada ...

Pilihan Editor

Elakkan Berat Berat Ketika Menguatkuasakan Garis Panduan Komuniti Dalam Talian - dummies

Elakkan Berat Berat Ketika Menguatkuasakan Garis Panduan Komuniti Dalam Talian - dummies

Hanya kerana anda mempunyai kuasa untuk berbuat demikian tidak bermakna bahawa semua masalah komuniti dalam talian memerlukan amaran dan banner. Ya, anda ingin menonjolkan keadaan negatif di dalam tunas, tetapi tidak, anda tidak mahu mendapat sedikit tentangnya sama ada. Kadang-kadang membiarkan slaid isu baik-baik saja. Sebagai pengurus komuniti, tugas anda untuk mengetahui ...

Elakkan Peluang Yang Berisiko Reputasi Blog Anda - dummies

Elakkan Peluang Yang Berisiko Reputasi Blog Anda - dummies

Apabila anda mengaitkan blog ibu anda dan jenama peribadi anda produk atau jenama syarikat, tidak dapat dielakkan bahawa anda akan menggosok satu sama lain. Suka atau tidak, anda boleh dan boleh dikaitkan dengan jenama itu. Tidak semua syarikat yang ingin memberi anda produk percuma adalah yang anda mahu ...

Peruntukkan Peranan ke Font di Laman Blog Anda - dummies

Peruntukkan Peranan ke Font di Laman Blog Anda - dummies

Apabila anda menetapkan peranan ke fon anda, membantu memastikan reka bentuk blog anda kelihatan profesional. Menjaga tujuan fon anda jelas menjadikan reka bentuk navigasi blog anda lebih berkesan dan reka bentuk keseluruhan anda lebih mudah di mata. Selepas anda memilih dua atau tiga fon pelengkap yang juga mempunyai perbezaan yang cukup untuk menonjol dari satu sama lain (lihat ...