Mọi người cho em hỏi: Mảng 2 chiều là con trỏ cấp 2 trỏ đến các con trỏ cấp 1, và mỗi con trỏ cấp 1 trỏ đến các phần tử. Vậy tại sao tên mảng 2 chiều lại là địa chỉ của phần tử đầu tiên mà không phải là địa chỉ của con trỏ cấp 1 đầu tiên. Khi khai báo 1 mảng hai chiều, a và *a giống nhau ư???
Thắc mắc về mảng 2 chiều trong C
mảng 2 chiều hay mảng 1 chiều đều chứa địa chỉ của phần tử đầu tiên trong mảng.
mảng 1 chiều a[0]
mảng 2 chiều a[0][0]
2 Likes
Đó là do bạn cấp phát tĩnh mới vậy thôi. 
#include <stdio.h>
#include <stdlib.h>
int main() {
int array2dStatic[10][10];
printf("%p -> %p -> %d\n", array2dStatic, array2dStatic[0], array2dStatic[0][0]);
int **array2dDynamic = (int**)malloc(sizeof(int*) * 10);
for (int i = 0; i < 10; ++i) array2dDynamic[i] = (int*)malloc(sizeof(int) * 10);
printf("%p -> %p -> %d\n", array2dDynamic, array2dDynamic[0], array2dDynamic[0][0]);
return 0;
}
0x7ffd50ef3db0 -> 0x7ffd50ef3db0 -> 0
0x24b2020 -> 0x24b2080 -> 0
1 Like
Mảng tĩnh không tổ chức như vậy
thực ra bạn có thể malloc 2 lần rồi ngăn ra chứ ko cần malloc M+1 lần như đã được học
mảng tĩnh cũng thế thôi.
3 Likes
Vậy mảng hai chiều tĩnh có cấu trúc như thế nào khác với mảng hai chiều động ???
Em đã thử với mảng hai chiều tĩnh: a == *a nhưng a+1 != *a+1 ; điều này ko xảy ra với mảng hai chiều động ???
Ví dụ: ta có mảng int a[10][20]
Dễ thấy a[0] == a vậy a[1] là cái gì? Thật sự a[1] (và a[0]) là một giá trị và kiểu của nó là int[20]. Vậy a+1 sẽ trỏ đến vị trí cách a 20 ô int. Tương tự 20 ô nữa mới là a+2.
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?