c ++ ชี้ VS อาร์เรย์
ชี้และอาร์เรย์มีความสัมพันธ์กันอย่างใกล้ชิด ในความเป็นจริงตัวชี้และอาร์เรย์ในหลายกรณีสามารถใช้แทนกัน ยกตัวอย่างเช่นตัวชี้ไปยังจุดเริ่มต้นของอาร์เรย์อาร์เรย์ที่สามารถเข้าถึงได้โดยการหาค่าตัวชี้หรือดัชนีอาร์เรย์ พิจารณาโปรแกรมต่อไปนี้:
#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *ptr; // 指针中的数组地址 ptr = var; for (int i = 0; i < MAX; i++) { cout << "Address of var[" << i << "] = "; cout << ptr << endl; cout << "Value of var[" << i << "] = "; cout << *ptr << endl; // 移动到下一个位置 ptr++; } return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
Address of var[0] = 0xbfa088b0 Value of var[0] = 10 Address of var[1] = 0xbfa088b4 Value of var[1] = 100 Address of var[2] = 0xbfa088b8 Value of var[2] = 200
อย่างไรก็ตามตัวชี้และอาร์เรย์แทนกันไม่ได้อย่างสมบูรณ์ ยกตัวอย่างเช่นพิจารณาโปรแกรมต่อไปนี้:
#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; for (int i = 0; i < MAX; i++) { *var = i; // 这是正确的语法 var++; // 这是不正确的 } return 0; }
ผู้ประกอบการชี้ * ถูกนำไปใช้ var เป็นที่ยอมรับอย่างสมบูรณ์ แต่ค่าการปรับเปลี่ยน var เป็นสิ่งผิดกฎหมาย เพราะนี่คือ var เป็นตัวชี้ไปยังจุดเริ่มต้นของค่าคงที่อาร์เรย์ก็ไม่สามารถทำหน้าที่เป็นมูลค่าซ้าย
เพราะชื่ออาร์เรย์สอดคล้องกับตัวชี้คงที่พวกเขาไม่ได้เปลี่ยนค่าของอาร์เรย์คุณยังสามารถใช้แบบฟอร์มตัวชี้ในการแสดงออก ตัวอย่างต่อไปนี้เป็นคำสั่งที่ถูกต้องที่ var [2] 500 ที่ได้รับมอบหมาย:
*(var + 2) = 500;
ข้อความข้างต้นถูกต้องและประสบความสำเร็จสามารถรวบรวมเพราะ var ไม่เปลี่ยนแปลง