Giải thích code có **&

Khi viết hàm trong mảng 2 chiều của c ạ. Thì có dùng đến ký hiệu **&
Ví dụ

 void nhapmt(int **&a, int *m, int *n){
	int i,j;
	printf("\nNhap co cua ma tran");scanf("%d%d",m,n);
	a=(int **) malloc(sizeof(int)*(*n)*(*m));
	for(i=0;i<*m; i++)
	{
		a[i]=(int *) malloc(sizeof(int)*(*n));
		for(j=0; j<*n; j++)
			scanf("%d",&a[i][j]);
	}
	
}

nhưng ở hàm xuất
Void xuat (int **a, int m, int n) thì lại không có ạ. Ai coa thể giải thích giúp e là khi nào thì cần thêm giấu & kia vô không ạ. Với hàm nhapmatran thì sao output lại là ma trận A. Mà e tưởng ma trận A mình nhận nó phải là input ạ. E cảm ơn ạ.

xài ref & khi em cần thay đổi giá trị của biến đó. Ở đây a có thay đổi giá trị, trỏ tới vùng nhớ được cấp phát bằng malloc. Giống như swap(a, b) thì a, b sau khi truyền vào hàm swap sẽ thay đổi giá trị nên em phải truyền nó bằng tham chiếu :V m, n ở đây truyền tham chiếu cũng được, cần gì truyền con trỏ thế kia gây rối :V đã phóng lao & thì phải theo lao & luôn chứ :V Mà code này C, C++ lẫn lộn gây nhức đầu là phải rồi.

khi xuất thì a ko thay đổi giá trị, a lại chỉ là 1 con trỏ, copy ko tốn kém nên truyền 1 copy của a là được rồi.

mà em thấy nó khó hiểu thì em cứ thử thách viết code ko xài tham chiếu để thay đổi giá trị biến truyền vào. Như code trên em có thể tạo 1 struct gọi là matrix2i_t rồi viết hàm cấp phát trả về 1 matrix2i_t nếu là code C:

typedef struct {
    int** a;
    int m;
    int n;
} matrix2i_t;

matrix2i_t make_matrix2i() {
    int** a, m, n, int i, j;
    printf("\nNhap co cua ma tran");
    scanf("%d%d", &m, &n);
    a = (int**)malloc(sizeof(int*) * m);
    for(i = 0;i < m; i++)
    {
        a[i] = (int*)malloc(sizeof(int) * n);
        for(j = 0; j < n; j++)
            scanf("%d", &a[i][j]);
    }
    return matrix2i_t(a, m, n);
}

à code thử mới thấy em cấp phát cho a sai nha :V cấp phát đúng số hàng thôi, mà kích thước mỗi hàng là kích thước của con trỏ sizeof(int*) chứ ko phải int đâu :V

3 Likes

Cái **& là hôm cô giáo e viết vậy e viết theo. Mà a có thể giải thích giúp e cái phần out put input k ạ.

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