Nếu bạn cần bộ nhớ tiếp giáp, bạn có một vài lựa chọn.
Bạn năng động có thể phân bổ một khối duy nhất của bộ nhớ, và sau đó tính toán offsets của bạn bằng tay, như vậy:
size_t rows, cols;
...
int *arr = malloc(sizeof *arr * rows * cols);
...
arr[i * rows + j] = ...; // logically equivalent to arr[i][j]
Bạn có thể thiết lập một mảng thứ hai của con trỏ vào mảng chính:
int **arrp = malloc(sizeof *arrp * rows);
...
for (i = 0; i < rows; i++)
arrp[i] = &arr[i * rows];
...
arrp[i][j] = ...;
nhớ rằng bạn sẽ phải miễn phí cả haiarr
và arrp
.
Nếu bạn có một thực hiện C99, bạn chỉ có thể thiết lập một con trỏ đến một VLA, như vậy:
int (*arrp)[cols] = (int (*)[cols]) arr;
...
arrp[i][j] = ...;
Lưu ý rằng trong trường hợp này, bạn không bố trí bất kỳ bộ nhớ cho một mảng thứ cấp, bạn cũng không cần phải tính toán con trỏ theo cách thủ công vào mảng chính; tất cả những gì bạn phải làm là đặt arrp
đến cùng một vị trí như arr
và để cho các quy tắc về số học con trỏ thực hiện tất cả công việc.
Nếu những hình ảnh không phải là lớn, bạn chỉ có thể thiết lập một VLA (một lần nữa, C99 hoặc mới hơn):
int arr[rows][cols];
nhưng trong thực tế đây không phải là một ý tưởng tốt; stack frame thường có kích thước khá giới hạn.
Nguồn
2012-02-21 20:04:35
Không có con trỏ kép nào không phải là mảng đa chiều. –
Chắc chắn không, nhưng bạn có thể làm cho nó hoạt động giống như một mảng – Akshay
Tại sao sử dụng mô phỏng một mảng 2D khi bạn chỉ đơn giản là có thể sử dụng một mảng? –