Con trỏ trong mảng 1 chiều

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?

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.

1 Like

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ới std::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ới std::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.

3 Likes

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

1 Like

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à!

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