Cấp phát mảng động bằng hàm trong C++

#include<iostream>
using namespace std;
int allocMatrix(int **A,int m, int n)
{
	*A=new int[m*n];
	if(*A==NULL) return 0;
	return 1;
}

int main()
{
	int m,n;
	int *A, *B, *C;
	cout<<"Nhap so dong cua ma tran: ";
	cin>>m;
	cout<<"Nhap so cot cua ma tran: ";
	cin>>n;
	allocMatrix(&A,m,n);
	cout<<"Nhap cac phan tu cua ma tran: ";
	for(int i=0;i<m*n;i++) cin>>A[i];
	cout<<endl;
	for(int i=0;i<m*n;i++) cout<<A[i]<<" ";
}

Cho em hỏi vì sao khi khai báo biến trong hàm phải là **A mà không phải là *A như dưới vì như đoạn code dưới sẽ báo lỗi?

int allocMatrix(int *A,int m, int n)
{
	A=new int[m*n];
	if(A==NULL) return 0;
	return 1;
}
//sau đó gọi hàm trong hàm main như sau:
int main()
{
int *A;
allocMatrix(&A,m,n);
}
1 Like

**A = con trỏ trỏ tới con trỏ.
Tức giá trị A lưu trữ là một địa chỉ trỏ tới một con trỏ.
Ví dụ int *a;
-> a là con trỏ trỏ tới kiểu int
int **b = &a;
-> b là con trỏ trỏ tới con trỏ kiểu int.

1 Like

Vậy tại sao không dùng như đoạn code dưới được nhỉ?

1 Like

Bởi vì code dưới sai cú pháp. con trỏ trỏ tới con trỏ thì cần dùng 2 dấu **

1 Like

nói ngắn gọn là mảng dùng để chứa địa chỉ con trỏ , thay vì dùng mảng thì dùng 1 con trỏ để chứa địa chỉ con trỏ…

code thứ 2 khi ra khỏi hàm vùng nhớ bị thu lại. code thứ 1 lấy địa chỉ để khởi tạo mảng-> tác động trực tiếp tới con trỏ truyền vào.

1 Like

Nói ngắn gọn con trỏ của mảng bao nhiêu chiều thì có bấy nhiêu đấu * nhé bạn.

Dùng int* &A đỡ hơn chứ :smiley: C++ mà.

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