มีหลายวิธีในการหาความยาวของอาร์เรย์ใน C/C++ นี่คือวิธีที่นิยมใช้งานมากที่สุด 2 วิธี
วิธีที่ 1: ใช้ตัวดำเนินการ sizeof
วิธีนี้เป็นที่นิยมและเข้าใจง่ายที่สุด โดยการหารขนาดของอาร์เรย์ทั้งหมดด้วยขนาดขององค์ประกอบหนึ่งตัว
ตัวอย่าง
#include <iostream>
using namespace std;
int main() {
int arr[5] = {4, 1, 8, 2, 9};
int len = sizeof(arr) / sizeof(arr[0]);
cout << "The length of the array is: " << len;
return 0;
}
ผลลัพธ์
The length of the array is: 5
คำอธิบาย
sizeof(arr)= ขนาดของอาร์เรย์ทั้งหมด (ในหน่วยไบต์)sizeof(arr[0])= ขนาดขององค์ประกอบหนึ่งตัว (ในหน่วยไบต์)- การหารทั้งสองค่าจะได้จำนวนองค์ประกอบ
วิธีที่ 2: ใช้ Pointer Arithmetic
วิธีนี้ใช้คุณสมบัติของ pointer ในการคำนวณที่อยู่หน่วยความจำ
ตัวอย่าง
#include <iostream>
using namespace std;
int main() {
int arr[5] = {5, 8, 1, 3, 6};
int len = *(&arr + 1) - arr;
cout << "The length of the array is: " << len;
return 0;
}
ผลลัพธ์
The length of the array is: 5
คำอธิบาย
&arr= ที่อยู่ของอาร์เรย์ทั้งหมด (ชนิดint (*)[5])&arr + 1= ที่อยู่ทันทีหลังจบอาร์เรย์ (เลื่อนไป 1 อาร์เรย์ = 5 int)*(&arr + 1)= แปลงกลับเป็น pointer ชนิดint*ชี้ถึงตำแหน่งหลังอาร์เรย์arr= pointer ชี้ตัวแรกของอาร์เรย์ (decay toint*)- การลบ pointer ทั้งสองให้จำนวนองค์ประกอบ
ข้อจำกัดสำคัญ
วิธีทั้งสองใช้ได้เฉพาะอาร์เรย์ที่ประกาศในขอบเขตเดียวกัน (local array) เท่านั้น หากส่งอาร์เรย์เข้าฟังก์ชัน จะ decay เป็น pointer และ sizeof จะให้ขนาดของ pointer แทน
แนวทางแก้ไขสำหรับฟังก์ชัน
// ส่งขนาดมาพร้อมกับอาร์เรย์
void printArray(int arr[], int size) {
// ใช้ size ที่ส่งมา
}
// หรือใช้ template (C++ เท่านั้น)
template <size_t N>
void printArray(int (&arr)[N]) {
// ใช้ N ได้เลย
}