@2501has already answered your question, nhưng vì bạn muốn mảng được sửa đổi được phản ánh với hàm chính, bạn không thực sự cần một con trỏ tới mảng (điều này sẽ làm phức tạp thêm)! Chỉ cần vượt qua mảng trực tiếp vì bạn sẽ nhận được kết quả mong đợi!
Tại sao, bạn hỏi?
Câu trả lời ngắn gọn: Trong C, mảng được chuyển bằng tham chiếu.
Long trả lời:
Luôn ghi nhớ rằng khi bạn sử dụng tên của một mảng, nó được chuyển đổi sang một con trỏ đến phần tử đầu tiên của nó†. Điều này thường được gọi là "array decay".
Trở lại với mã của bạn, Sơ đồ bool matrix[rows][cols];
sẽ là:
+---------------------+---------------------+---------------------+---------------------+---------------------+
| | | | | |
| matrix[0][0] | matrix[0][1] | matrix[0][2] | ... | matrix[0][cols - 1] |
| | | | | |
+---------------------+---------------------+---------------------+---------------------+---------------------+
| | | | | |
| matrix[1][0] | matrix[1][1] | matrix[1][2] | ... | matrix[1][cols - 1] |
| | | | | |
+---------------------+---------------------+---------------------+---------------------+---------------------+
| | | | | |
| ... | ... | ... | ... | ... |
| | | | | |
+---------------------+---------------------+---------------------+---------------------+---------------------+
| | | | | |
| matrix[rows - 1][0] | matrix[rows - 1][1] | matrix[rows - 1][2] | ... | matrix[rows - 1][cols - 1] |
| | | | | |
+---------------------+---------------------+---------------------+---------------------+---------------------+
Từ sơ đồ trên, rõ ràng là yếu tố đầu tiên của
bool matrix[rows][cols];
là mảng con đầu tiên matrix[0][0]
để matrix[0][cols - 1]
. Vì vậy, những gì xảy ra ở đây là địa chỉ của subarray này đang được chuyển đến hàm. Đây là loại bool (*)[cols]
. Điều này có nghĩa rằng
void func(int rows, int cols, bool matrix[rows][cols])
sẽ làm việc theo cách tương tự như
void func(int rows, int cols, bool (*matrix)[cols])
Vì vậy, ví dụ, nếu bạn muốn ghi vào khe thứ ba của mảng con thứ hai của matrix
, bạn có thể sử dụng matrix[1][2] = WHATEVER;
và những thay đổi được thực hiện từ chức năng cũng sẽ ảnh hưởng đến người gọi kể từ khi địa chỉ được thông qua.
†: Có một vài trường hợp ngoại lệ nơi mảng "phân rã" không xảy ra. Xem Exception to array not decaying into a pointer?
Chỉ cần loại bỏ '&' và '*' và tất cả đều phải là phân đoạn mảng - tốt cho con trỏ khi được truyền dưới dạng tham số hàm. –
Lỗi nào bạn nhận được chính xác? – jboockmann
@pytheos nó là một loại con trỏ không tương thích. Xấu của tôi - trông giống như rất nhiều khi tôi đã sửa đổi đầu tiên của tôi. – Synlar