cho em hỏi, khi làm việc với mảng 1 chiều hay nhiều chiều có nhất thiết phải cấp phát bộ nhớ động cho chúng ko?
Con trỏ trong mảng 1 chiều
Tùy tình hình, nếu không biết trước kích thước thì phải sử dụng cấp phát động thôi.
C++ với mảng thì xài std::vector hết. Mà cơ bản thì std::vector là mảng động. Có rất ít lý do để mảng nằm trên stack, 1 trong những lý do đó là mất công quản lý bộ nhớ bằng con trỏ. Với C++ có class với destructor rồi thì ko cần lo lắng nữa. std::vector có thể hiểu là class mảng động.
-
Khai báo
int arr[10];
tương đương vớistd::vector<int> arr(10);
mất công type 1 tí. -
Khai báo mảng 2 chiều
int arr[10][20];
so vớistd::vector< std::vector<int> > arr(10, std::vector<int>(20));
mất công type hơn khá nhiều, nhưng có thể xài typedef:typedef std::vector IntVect;
typedef std::vector IntMatrix2d;
//…
IntMatrix2d arr(10, IntVect(20)); -
Truy cập phần tử thứ i trong mảng y hệt nhau:
arr[i];
-
Truyền mảng vào hàm, ví dụ hàm print:
print(arr, 10);
hoặc nếu ko nhớ số 10 thì phải ghi làprint(arr, sizeof(arr)/sizeof(*arr));
. So với std::vector, ko cần truyền kích cỡ mảng:print(arr);
-
Hàm trả về 1 mảng: C++ ko trả về mảng được, chỉ có thể trả về con trỏ trỏ tới mảng cấp phát động, nhưng phải nhớ giải phóng mảng đó sau khi xài xong, hoặc truyền con trỏ tới mảng cấp phát tĩnh vào hàm, làm cách khai báo/sử dụng hàm phức tạp hơn. Với std::vector thì viết hàm trả về
std::vector
vô tư như hàm trả vềint
.
lưu ý là truyền std::vector vào hàm thì luôn truyền tham chiếu, tức là có &
, trừ phi muốn truyền bảng copy của mảng thì ko cần &
.
với mảng ký tự hay chuỗi thì C++ có lớp std::string
, nên xài thay cho char[]
hay char*
. Lúc mới học thì viết char*
cho hiểu cấp phát động cấp phát tĩnh là gì chứ xài thì nên xài std::string
cho khỏe. Tương tự với mảng có type ko phải ký tự thì xài std::vector
cho khỏe.
Không biết bạn có hiểu sự khác nhau giữa
void Nhap(int a[10], int &n); và void Nhap(int a[10], int n); chưa nhưng mình sẽ đưa ví dụ cho bạn dễ hiểu hơn (còn hiểu rồi thì cứ xem chơi vậy =)))
void Nhap(int a[10], int &n)
{
int i;
printf("\nNhap vao n: "); scanf("%d", &n);
for(i = 0; i < n; i++)
{
printf("\nNhap phan tu %d: ", i + 1); scanf("%d", &a[i]);
}
}
void Nhap(int a[10], int n)
{
int i;
for(i = 0; i < n; i++)
{
printf("\nNhap phan tu %d: ", i + 1); scanf("%d", &a[i]);
}
}
Nói ngắn gọn lại là khi nào làm thay đổi giá trị của n trong hàm thì ta thêm dấu & còn không thì khỏi
Cậu làm mấy bài xóa, thêm các phần tử vào mảng là sẽ hiểu thôi
Cho em hỏi để xuất ra mảng các số lẻ em làm như dưới nhưng giờ e chỉ muốn xuất số lẻ thui chứ ko phải chỗ nào số lẻ thì xuất, chỗ nào số chẵn thì gán nó =0 như code dưới, ai cho e ý tưởng với ạ:
int inLe(int mangLe[7][7], int a[7][7], int n, int m)
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
if(a[i][j] % 2 != 0)
{
mangLe[i][j] = a[i][j];
}
else
{
mangLe[i][j] = 0;
}
}
}
return 0;
}
không hiểu ý của bạn cho lắm: Cho em hỏi để xuất ra mảng các số lẻ em làm như dưới nhưng giờ e chỉ muốn xuất số lẻ thui chứ ko phải chỗ nào số lẻ thì xuất, chỗ nào số chẵn thì gán nó =0
Theo ý mình hiểu là 2 ý bạn nói là như nhau mà!