Ý nghĩa của pointer trong code này

Hôm trước em tìm thấy code của sắp xếp chèn, về thuật toán thì không có vấn đề gì nhưng mà mọi người cho em hỏi, ở cái phần khai báo hàm(phần int *array), khi em thử xóa dấu * đi thì nó báo lỗi không chạy được, còn đê nguyên thì em thấy nó hoạt động giống hệt mảng mà không có phần khai báo mảng. Mọi người giải thích cho em với ạ!!!

void insertion(int *array, int size) {
    int key, j;
    for(int i = 1; i<size; i++) {
        key = array[i];//take value
        j = i;
        while(j > 0 && array[j-1]>key) {
            array[j] = array[j-1];
            j--;
        }
        array[j] = key;   //insert in right place
    }
}

Muốn hiểu thì đọc cái này: https://www.learncpp.com/cpp-tutorial/6-8-pointers-and-arrays/

3 Likes

Thử code này xem có chạy giống nhau không.

void insertion(int *array, int size) {
    int key, j;
    for(int i = 1; i<size; i++) {
        key = *(array+i);//take value
        j = i;
        while(j > 0 && *(array +j-1)>key) {
            *(array + j) = *(array + j-1);
            j--;
        }
        *(array + j) = key;   //insert in right place
    }
}
1 Like

Ban đầu mình có cái mảng array.
Khi gọi hàm insertion để sắp xếp mảng này, cần truyền mảng này vào hàm insertion.
Để truyền mảng vào trong hàm , thông thường hàm insertion cần biết 2 thông tin : địa chỉ của mảng và size của mảng.
Địa chỉ của mảng chính là cái này : int *array.
Bởi vì con trỏ dùng để lưu địa chỉ , do đó nếu xóa * đi thì trình biên dịch sẽ hiểu đây là 1 biến int thông thường chứ ko phải pointer nữa -> lỗi.

Nó không phải là mảng,do người ta đặt tên biến như vậy khiến mình dễ bị lẫn lộn.
*array ở đây là con trỏ, trước khi gọi hàm insertion này cần setup cho nó point đến 1 cái mảng đã có từ trước. Sau khi đã setup xong thì có thể dùng nó để thao tác trên mảng nên 2 cách viết sau là tương đương:

Thông thường người ta hay dùng cách 1 vì code tự nhiên hơn.

2 Likes

Chỉ là để bạn ấy hiểu về array, thực chất là con trỏ trỏ đến địa chỉ của phần tử đầu tiên trong mảng. Còn các phần tử sau đó sẽ có địa chỉ liền kề.

#include <iostream>

using namespace std;

class cClass {
    public:
    int A;
    int B;
    cClass(int a, int b);
};

cClass::cClass(int a, int b){
    A =a;
    B = b;
}
cClass* a[3]{ new cClass(1,2), new cClass(3,4),  new cClass(5,6)};
int main()
{
    cClass* x = *(a+2);
    cout << *((int*)x + 1) << endl; 
    return 0;
}

3 Likes

mảng trong c/c++ dc quản lý bởi địa chỉ của phần tử arr[0]
do đó khi khai báo *arr tức là nó tự hiểu đó là địa chỉ của phần tử đầu tiên của mảng
*arr hay arr[] là 2 cách khai báo mảng giống nhau.

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