về phần truyền mảng vào hàm thì truyền int** a1
thì a1 là con trỏ trỏ tới con trỏ trỏ tới số nguyên. Còn truyền int a2[][3]
thì a2 là con trỏ trỏ tới mảng chứa 3 số nguyên.
edit: int a1[][]
ko được, lỗi declaration of 'a' as multidimensional array must have bounds for all dimensions except the first
, chỉ được xài 1 cái [] vì C/C++ hiểu mảng đa chiều là con trỏ trỏ tới mảng “1” chiều…
a1 ví dụ có giá trị là x, hay trỏ tới địa chỉ x, thì a1 + 1 thực ra là x + 4, nếu sizeof(con trỏ) là 4, hoặc x + 8 nếu size của con trỏ là 8.
[pointer_1][pointer_2]...
^a1 ^a1+1
còn a2 ra địa chỉ y, thì a2 + 1 thực ra là y + 3*4 = y + 12, nếu sizeof int là 4, vì mảng 2 chiều được xếp liên tục
[int_11][int_12][int_13][int_21][int_22][int_23]...
^a2 ^a2+1
với kiểu này thì mỗi dòng trong mảng 2 chiều a2 nằm sát nhau, còn kiểu a1 kia thì mỗi dòng nằm 1 nơi. 2 cái khác nhau.
với mảng 3 chiều 2x2x3 thì
[int_111][int_112][int_113][int_121][int_122][int_123][int_211][int_212][int_213]...
^a3 ^a3+1
a3 + 1 thực chất là a3 + (2*3)*4. Vì vậy nên khi truyền mảng nhiều chiều nó ko cần biết chiều đầu tiên gồm bao nhiêu phần tử, mà cần biết tất cả các chiều còn lại có bao nhiêu phần tử, để a3 + 1 có thể tính ra chính xác được.