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);
}
Bài liên quan
**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.
Vậy tại sao không dùng như đoạn code dưới được nhỉ?
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 **
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.
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ứ C++ mà.