mảng không phải là con trỏ
trong C thì mảng bị decay thành con trỏ. Để ngăn chặn điều này ở C++ thì phải truyền mảng bằng tham chiếu. Vì mảng có thể có 1 2 3 4 5… phần tử nên phải xài template để khi biên dịch C++ biết kích thước của mảng là bao nhiêu.
#include <iostream>
void func(float* f, size_t size)
{
std::cout << "POINTER TO ARRAY\n";
std::cout << "sizeof(f) = " << sizeof(f) << "\n"; //luôn in ra sizeof(void*)
std::cout << "sizeof(void*) = " << sizeof(void*) << "\n";
std::cout << "number of float elements in the array that f points to = " << size << "\n";
std::cout << "Content of the array: ";
for (size_t i = 0; i < size; ++i)
std::cout << f[i] << " ";
std::cout << "\n";
}
template <size_t N>
void func(float (&f)[N])
{
std::cout << "ARRAY\n";
std::cout << "sizeof(f) = " << sizeof(f) << "\n";
std::cout << "sizeof(void*) = " << sizeof(void*) << "\n";
std::cout << "number of float elements in the array that f points to = " << N << "\n";
std::cout << "Content of the array: ";
for (size_t i = 0; i < N; ++i)
std::cout << f[i] << " ";
std::cout << "\n";
}
int main()
{
float arr[] = { 1.2f, 2.4f, 4.4f, 3.3f, 5.5f };
float* ptr = new float[5];
ptr[0] = -2.0f;
ptr[1] = -2.0f;
ptr[2] = 3.0f;
ptr[3] = 4.0f;
ptr[4] = -5.0f;
func(arr);
std::cout << "\n";
func(ptr, 5);
}
output là
ARRAY
sizeof(f) = 20
sizeof(void*) = 8
number of float elements in the array that f points to = 5
Content of the array: 1.2 2.4 4.4 3.3 5.5
POINTER TO ARRAY
sizeof(f) = 8
sizeof(void*) = 8
number of float elements in the array that f points to = 5
Content of the array: -2 -2 3 4 -5
cú pháp truyền mảng bằng tham chiếu là <kiểu phần tử> (&arr)[N]
, trong đó N
là kích thước của mảng mà compiler biết trước thông qua template <size_t N>
.
em có thể viết ko cần template: float (&arr)[1]
, float (&arr)[2]
, float (&arr)[3]
, float (&arr)[4]
, float (&arr)[5]
, v.v… nhưng sẽ ko truyền được mảng ví dụ 1000 phần tử. Xài template cho nó tự động tạo mấy cái mảng có kích thước khác nhau luôn.
nếu em xài C++ thì nên xài std::array
thay cho mảng C. Cú pháp dài dòng, xấu hơn nhưng tránh mấy cái array decay thành con trỏ. Còn mảng động thì em xài std::vector
cho khỏi mất công quản lý bộ nhớ.
và sách nào ghi “mảng là con trỏ” thì đốt sách đó hoặc đọc lại cho kĩ câu đó viết là gì nhé.