Cách khai báo mảng đa chiều?

Anh ạ. em đang học về mảng và hàm. nhưng gần đây gặp 1 số vấn đề khúc mắc. Cần anh giải thích.Cụ thể là khi em khai báo 1 mảng đa chiều ở hàm main. và muốn nhập bằng 1 hàm void khác. thì mình cần phải khai báo tham trị ở ngay bên cạnh tên hàm đúng không ạ. Nhưng với mang đa chiều cần khai báo như thế nào ạ.

#include<stdio.h>
void nhap(int a[][100], int &hang,int &cot)
{
}
int main ()
{
    int a[100][100],hang,cot;
}

Với đoạn code trên thì sao lại phải khai báo a[][100] như vậy mà k được a[][] hoặc a[]?
Em cảm ơn ạ!

2 Likes

mảng 2 chiều thì phải a[][] chứ… [][] là [ndòng][ncột]

mà a[][100] hay a[100][100] thì hình như C++ nó hiểu là như nhau thôi =)))

Nhưng tại sao lại phải có trị số bên trong [] ạ

@D_ng_Nguy_n_Van Xem cách post code dùng Markdown ở đây nhé.

P/S: @D_ng_Nguy_n_Van có muốn đổi nick thành Duong_Nguyen_Van hay nick khác không? Vào đây nhé

mảng tĩnh thì phải cho trước như vậy chứ =)))

Về bản chất thì mảng 2 chiều cũng có cơ chế lưu trữ như mảng 1 chiều. Tức là 1 dãy bộ nhớ tuần tự liên tục và biến mảng chỉ lưu địa chỉ ô đầu tiên của mảng.

Nhưng khi truy vấn và thao tác, chúng ta truyền vào dạng chỉ số [hàng][cột]. Khi đó, việc chỉ định rõ số lượng phần tử của cột là cần thiết để trình biên dịch có thể ánh xạ [hàng][cột] sang địa chỉ thực tế 1 chiều trên bộ nhớ.

Ví dụ:

int ncols = 5;
int array2D[3][ncols] = 
	{
		{ 1,  2,  3,  4,  5 },  //row 1
		{ 6,  7,  8,  9,  10 }, //row 2
		{ 11, 12, 13, 14, 15 }  //row 3
	};
cout << a[1][2]; // Thực chất là a[1*ncols + 2]

Câu trả lời mình tham khảo ở đây

a[2][3] nghĩa là (pt ở) dòng 2 cột 3 của a :slight_smile:

Không gian địa chỉ là 1D, vậy tạo thành mảng 2D thì phải có công thức :slight_smile: nhưng muốn quy đổi thì phải biết mảng có bao nhiêu cột. Thì đó :smiley:

note

Công thức như sau :slight_smile: a[i][j] = *(a + i * no_col + j); nhưng đây là chi tiết cài đặt.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?