30/09/2018, 23:38

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);
}
*grab popcorn* viết 01:53 ngày 01/10/2018

**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.

viết 01:50 ngày 01/10/2018

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

Mai Hữu viết 01:51 ngày 01/10/2018

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 **

Reoteu Ray viết 01:38 ngày 01/10/2018

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ỏ…

nghia viết 01:43 ngày 01/10/2018

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.

Than Vo viết 01:45 ngày 01/10/2018

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.

rogp10 viết 01:52 ngày 01/10/2018

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

Bài liên quan
0