ความแตกต่างระหว่าง Array กับ Pointer
เนื้อหา
มีความสัมพันธ์ใกล้ชิดระหว่างอาร์เรย์และตัวชี้ ตัวชี้สามารถใช้เพื่อเข้าถึงองค์ประกอบอาร์เรย์เข้าถึงทั้งอาร์เรย์โดยใช้ตัวชี้ทางคณิตศาสตร์ทำให้การเข้าถึงเร็วขึ้น มีความแตกต่างพื้นฐานระหว่างตัวชี้และอาเรย์นั่นคืออาเรย์คือชุดของตัวแปรของชนิดข้อมูลที่คล้ายกันในขณะที่ตัวชี้เป็นตัวแปรที่เก็บที่อยู่ของตัวแปรอื่น มีความแตกต่างอื่น ๆ ระหว่างอาเรย์กับตัวชี้ที่กล่าวถึงด้านล่างในแผนภูมิเปรียบเทียบ
- แผนภูมิเปรียบเทียบ
- คำนิยาม
- ความแตกต่างที่สำคัญ
- ข้อสรุป
แผนภูมิเปรียบเทียบ
พื้นฐานสำหรับการเปรียบเทียบ | แถว | ชี้ |
---|---|---|
การประกาศ | // ใน C ++ พิมพ์ var_name; // ในชวา พิมพ์ var-name; var_name = ประเภทใหม่; | // ใน C ++ พิมพ์ * var_name; |
การทำงาน | เก็บค่าของตัวแปรของประเภทข้อมูลที่เป็นเนื้อเดียวกัน | เก็บที่อยู่ของตัวแปรอื่นที่เป็นประเภทข้อมูลเดียวกันกับตัวแปรตัวชี้ประเภทข้อมูล |
รุ่น | อาร์เรย์ของพอยน์เตอร์สามารถสร้างขึ้นได้ | สามารถสร้างตัวชี้ไปยังอาร์เรย์ได้ |
การสนับสนุน Java | สนับสนุนแนวคิดของอาเรย์ | ไม่รองรับพอยน์เตอร์ |
การเก็บรักษา | อาเรย์ปกติจะเก็บค่าของตัวแปรและอาเรย์ตัวชี้จะเก็บที่อยู่ของตัวแปร | พอยน์เตอร์ได้รับการออกแบบมาเป็นพิเศษเพื่อเก็บที่อยู่ของตัวแปร |
ความจุ | อาเรย์สามารถจัดเก็บจำนวนองค์ประกอบที่กล่าวถึงในขนาดของตัวแปรอาเรย์ | ตัวแปรตัวชี้สามารถเก็บที่อยู่ของตัวแปรได้ครั้งละหนึ่งตัวเท่านั้น |
นิยามของ Array
อาร์เรย์คือชุดขององค์ประกอบของประเภทข้อมูลเดียวกันและองค์ประกอบเหล่านี้ทั้งหมดจะถูกเรียกโดยชื่อสามัญซึ่งเป็นชื่อของตัวแปรอาร์เรย์ องค์ประกอบอาร์เรย์สามารถเข้าถึงได้โดยการเข้าถึงดัชนีเฉพาะของอาร์เรย์นั้นซึ่งองค์ประกอบนั้นถูกเก็บไว้อาเรย์สามารถเป็นอาร์เรย์หนึ่งมิติอาร์เรย์สองมิติหรืออาร์เรย์หลายมิติได้ อาร์เรย์ของพอยน์เตอร์สามารถสร้างได้เช่นอาเรย์ที่มีตัวแปรทั้งหมดเป็นตัวแปรพอยน์เตอร์ ใน 'C ++' อาร์เรย์จะได้รับการจัดสรรแบบคงที่ส่วนใน "Java" จะมีการจัดสรรอาร์เรย์แบบไดนามิก
// ในประเภท C ++ var_name; // ในชวา พิมพ์ var-name; var_name = ประเภทใหม่;
ที่นี่ 'ประเภท' หมายถึงชนิดข้อมูลของตัวแปรอาเรย์ 'var_name' หมายถึงชื่อที่กำหนดให้กับตัวแปรอาเรย์ 'ขนาด' แสดงถึงความจุของตัวแปรอาเรย์เช่นจำนวนองค์ประกอบ 'ประเภท' ที่สามารถเก็บไว้ในตัวแปรอาเรย์นั้น . มีวิธีการเข้าถึงอาเรย์สองวิธีโดยหนึ่งคือ 'ตัวคำนวณเลขคณิต' ตัวแรกและตัวทำดัชนีอาร์เรย์ตัวที่สองซึ่ง 'ตัวชี้เลขคณิต' นั้นเร็วกว่า
// การเข้าถึงโดยใช้ตัวชี้ทางคณิตศาสตร์ Void display_array (int * S) {ในขณะที่ (* s) {cout (<< "ค่าคือ" << * s); * s ++; }}
การใช้ 'ตัวคำนวณเลขคณิต' จะทำงานได้เร็วขึ้นเมื่อเทียบกับ 'การจัดทำดัชนีอาร์เรย์' เช่นการเข้าถึงตัวแปรอาร์เรย์โดยใช้ดัชนี หากคุณต้องการส่งอาเรย์ของพอยน์เตอร์ไปยังฟังก์ชั่นก็สามารถทำได้โดยใช้วิธีการเดียวกับที่คุณใช้ในการส่งอาเรย์ปกติเช่นเรียกใช้ฟังก์ชันโดยตรงด้วยชื่อของอาเรย์โดยไม่มีดัชนีใด ๆ
ให้เราเข้าใจด้วยตัวอย่าง
// ประกาศอาร์เรย์ของพอยน์เตอร์ int * p;
ที่นี่แสดงให้เห็นว่า ‘p’ เป็นอาร์เรย์ประเภทจำนวนเต็มจะเก็บที่อยู่ของตัวแปร 10 ประเภทจำนวนเต็ม ขอให้เราส่งอาร์เรย์ตัวชี้ด้านบนไปยังฟังก์ชั่นการแสดงผล ()
แสดงผล (p); // โทรฟังก์ชั่นการแสดงผล void display (int * d) {// ฟังก์ชั่นรับอาร์เรย์ตัวชี้ สำหรับ (int i = 0; i <10; i ++) {ศาล << ("index" <
ฟังก์ชั่นนี้จะแสดงค่าที่มีอยู่ในตัวแปรที่มีที่อยู่จะถูกเก็บไว้ในอาร์เรย์ตัวชี้ตามลำดับ
ความหมายของตัวชี้
ตัวชี้เป็นตัวแปรที่เก็บที่อยู่หน่วยความจำของตัวแปรอื่น ประเภทข้อมูลของทั้งสองตัวแปรตัวชี้และตัวแปรที่มีที่อยู่จะถูกกำหนดให้กับตัวแปรตัวชี้จะต้องเหมือนกัน ตัวแปรพอยน์เตอร์จะประกาศตามดังต่อไปนี้
// ประกาศในชื่อ C ++ type *;
ที่นี่ ‘type’ เป็นประเภทข้อมูล ‘name’ เป็นชื่อของตัวแปรตัวชี้ ‘type’ กำหนดประเภทของที่อยู่ตัวแปรที่สามารถเก็บไว้ในตัวแปรพอยน์เตอร์ ตัวอย่างเช่นตัวชี้จำนวนเต็มจะเก็บที่อยู่ของตัวแปรจำนวนเต็ม มีตัวดำเนินการตัวชี้สองตัวคือ ‘*’ และ ‘&’ ผู้ประกอบการ ‘*’ ส่งคืนค่าที่อยู่ที่อยู่ซึ่งถูกเก็บไว้ในตัวแปรตามด้วยเครื่องหมาย ‘*’ ตัวดำเนินการ ‘&’ จะส่งคืนที่อยู่ของตัวแปรตามด้วยเครื่องหมาย ‘&’
// ตัวอย่างเช่น int b = 10 int a = & b; // ที่นี่ที่อยู่ของ b ถูกเก็บไว้ในตัวแปร a // ให้ที่อยู่ของ b คือ 2000 ดังนั้นตอนนี้ = 2000 int c = * a; // ที่นี่ตัวแปรตัวชี้จำนวนเต็ม * a จะคืนค่าซึ่งตั้งอยู่ที่ที่อยู่ที่เก็บไว้ใน. ii c = 10
มีตัวดำเนินการทางคณิตศาสตร์เพียงสองตัวเท่านั้นที่คุณสามารถใช้กับพอยน์เตอร์เช่นการเพิ่มและการลบ หากคุณใช้การเพิ่มขึ้นของตัวแปรตัวชี้จำนวนเต็มจะเพิ่มขึ้นตามขนาดของประเภทข้อมูลเช่น 2 ไบต์เนื่องจากเป็นตัวชี้จำนวนเต็มการเพิ่มจะต้องชี้ตัวแปรจำนวนเต็มถัดไป เป็นกรณีเดียวกันกับการลดลง
// p เป็นตัวชี้จำนวนเต็มที่มีมูลค่า 2,000 p ++; // ตอนนี้ p = 2002 p--; // ตอนนี้ p มี 2,000 อีกครั้งที่ลดลงสองไบต์
- อาร์เรย์จะจัดเก็บตัวแปรของชนิดข้อมูลที่คล้ายคลึงกันและชนิดข้อมูลของตัวแปรนั้นจะต้องตรงกับประเภทของอาร์เรย์ ในทางกลับกันตัวแปรตัวชี้จะจัดเก็บที่อยู่ของตัวแปรประเภทที่คล้ายกับประเภทของตัวแปรประเภทตัวชี้
- เราสามารถสร้างอาเรย์ของพอยน์เตอร์เช่นอาเรย์ซึ่งตัวแปรคือตัวแปรพอยน์เตอร์ ในทางกลับกันเราสามารถสร้างตัวชี้ที่ชี้ไปยังอาร์เรย์
- Java รองรับอาเรย์ แต่มันไม่รองรับพอยน์เตอร์
- ขนาดอาร์เรย์ตัดสินใจจำนวนตัวแปรที่สามารถจัดเก็บได้ในขณะที่ ตัวแปรตัวชี้สามารถเก็บที่อยู่ของตัวแปรเท่านั้น
บันทึก:
Java ไม่สนับสนุนหรือหลีกเลี่ยงพอยน์เตอร์อย่างเคร่งครัด
สรุป:
เมื่อเราต้องการทำงานกับองค์ประกอบข้อมูลของชนิดข้อมูลที่คล้ายกันแทนที่จะทำงานแยกกันกับตัวแปรเราสามารถสร้างอาร์เรย์ของตัวแปรเหล่านั้นของชนิดข้อมูลที่คล้ายกันแล้วดำเนินการกับมัน พอยน์เตอร์จำเป็นสำหรับบางโปรแกรมมันให้พลังมหาศาล แต่น่าเสียดายถ้าตัวชี้มีค่าที่ไม่ถูกต้องมันจะเป็นบั๊กที่หายากที่สุด