Có cách nào để tạo mảng tập lệnh kép có kích thước thay đổi trong C (không phải C++, chỉ C) không? Tôi biết rằng để tạo một mảng tập lệnh có kích thước thay đổi, bạn chỉ cần sử dụng một con trỏ, ví dụ:
float *mảng;
mảng = (float *) calloc(sizeof(float), n);
Tạo một mảng float tập lệnh có kích thước n. Tôi có thể làm điều gì đó tương tự cho mảng tập lệnh kép không?
Không có mảng tập lệnh kép trong C; chỉ có mảng mảng. Ví dụ. cái này:
int a[3][3];
Nên đọc là "mảng 3 mảng 3 số nguyên", không phải "mảng 3 số nguyên". Điều này có thể được nhìn thấy ngay lập tức từ loại biểu thức - ví dụ:một [0]
là một biểu thức hợp lệ có kiểuint[3]
.
Đối với kiểu mảng, kích thước mảng là một phần của kiểu và do đó phải được biết tại thời điểm biên dịch. Vì vậy, mặc dù bạn có thể sử dụng loại "con trỏ tới mảng" để tạo một chiều động, phần còn lại vẫn phải được sửa:
int (*p)[3] // con trỏ tới mảng 3 int mỗi mảng
Có hai giải pháp truyền thống:
只需使用 width x chiều cao Mảng động một chiều gồm các phần tử, với chỉ số 1D được tính từ tọa độ 2D như sau: (y * chiều rộng + x)
bản thân bạn.
Sử dụng con trỏ tới con trỏ:
int** a = malloc(sizeof(int*) * chiều cao);
for (i = 0; i < chiều cao; ++i) a[i] = malloc(sizeof(int) * width);
a[0][0] = 123;
...
Vấn đề ở đây là mảng của bạn không còn cần phải có hình chữ nhật nữa, bạn thực sự không thể thực thi nó. Về mặt hiệu suất, nó cũng tệ hơn một khối bộ nhớ liền kề.
Trong C99, bạn cũng có thể sử dụng mảng có độ dài thay đổi:
void foo(int chiều rộng, int chiều cao) {
int a[chiều rộng] [chiều cao];
...
}
Tôi là một lập trình viên xuất sắc, rất giỏi!