Có hai vấn đề ở đây:
- C không hỗ trợ mảng 2D, chỉ có mảng của mảng hay mảng các con trỏ đến mảng, không ai trong số đó là khá điều tương tự như một mảng 2D
- C không cho phép truyền các mảng thành các đối số, chỉ con trỏ vào các mảng (generaly, bạn sử dụng con trỏ tới phần tử thứ 0 của mảng, vì đó là tên của mảng kết thúc bằng cách lập chỉ mục như vậy. truy cập mảng)
Vì vậy, vì vấn đề đầu tiên, bạn phải quyết định làm thế nào bạn sẽ đại diện cho một mảng 2D - hoặc là một mảng của mảng, hoặc một mảng của con trỏ đến mảng. Nếu bạn đi theo con đường đầu tiên, mã của bạn sẽ trông giống như:
void set_T(float (*T1)[100]) {
... do stuff with T1[i][j] ...
}
int main() {
float T[100][100];
set_T(T);
}
Ở đây, bạn đã tuyên bố T là một mảng của 100 mảng 100 phao, và set_T mất một con trỏ đến mảng 100 nổi như đối số của nó. Bạn chuyển 'T' trực tiếp tới set_T, vì ngôn ngữ xử lý các tên mảng như con trỏ tới phần tử thứ 0 của chúng.
Nếu thay vào đó bạn muốn sử dụng một mảng của con trỏ đến mảng, bạn kết thúc với một cái gì đó như:
void set_T(float **T1) {
... do stuff with T1[i][j] ...
}
int main() {
float *T[100];
float space[100*100];
for (int i = 0; i < 100; i++)
T[i] = space + i*100;
set_T(T);
}
Những bất lợi ở đây là bạn cần phải phân bổ không gian cho tất cả các mảng thứ hai cấp và khởi tạo thủ công tất cả các con trỏ mức đầu tiên để trỏ vào chúng. Sự tăng áp là kích thước của các mảng mức thứ hai không phải là một phần của kiểu đối số được truyền cho set_T, vì vậy bạn có thể dễ dàng xử lý các mảng có kích thước biến hơn. Tất nhiên, nếu bạn đang sử dụng C++ chứ không phải C, bạn không nên sử dụng các mảng C - bạn nên sử dụng std::vector
hoặc std::array
thay vào đó - cả hai đều chỉ chia sẻ vấn đề 1D mảng C, do đó, bạn cần một vec tơ vectơ hoặc một mảng các mảng (hoặc có thể hiểu được một vectơ của mảng hoặc một mảng vec-tơ)
Nguồn
2012-04-02 00:40:20
có thể trùng lặp của [truyền mảng 2D đến hàm] (http://stackoverflow.com/questions/8767166/passing-2d-array-to-function) – legends2k