Thắc mắc về Con Trỏ và Mảng trong C

Chào mọi người! Em đang tự học lập trình C, đến phần Mảng và Con Trỏ thì em có một số thắc mắc. Rất mong được mọi người giải đáp.

Đối với mảng 2 chiều Mang2c[ i ][ j ] và biến con trỏ ConTro
Có phải nếu ta thực hiện phép gán: ConTro=(int
)Mang2c;
thì sau đó biến con trỏ ConTro sẽ quản lý các phần tử của mảng hai chiều Mang2c và hoạt động như một mảng một chiều đúng không ạ?

Theo giả thiết trên thì em viết đoạn code:
Nhập vào một mảng hai chiều và in ra màn hình theo cách truy cập Mảng. Sau đó cũng in ra màn hình mảng đó theo cách của Con trỏ, nhưng kết quả lại không được như mong đợi:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main() {
    int *ConTro;
    int Mang2c[20][20];
    int i,j,n,m;
//n la so dong, m la so cot cua mang 2 chieu
    printf("Nhap so dong: "); scanf("%d", &n);
    printf("Nhap so cot : "); scanf("%d", &m);
    for(i=0;i<n;i++)
        for(j=0;j<m;j++) {
            printf("Gia tri thu [%d][%d]=", i,j);
            scanf("%d", &Mang2c[i][j]);
        }

    printf("\nTruy cap phan tu theo kieu Mang\n");
    for(i=0;i<n;i++) {
        for(j=0;j<m;j++) printf("%3d", Mang2c[i][j]);
        printf("\n");
    }

    printf("\nTruy cap phan tu theo kieu Con tro\n");
    ConTro=(int*)Mang2c;
    for(i=0;i<m*n;i++) printf("%d ", ConTro[i]);

    getch();
    return 0;
}

Và đây là kết quả:

Sau khi sửa và thử rất nhiều lần, ví dụ:
+) Thay n*m (dòng 25) bằng một con số cụ thể thì kết quả lúc chính xác, lúc không (phụ thuộc n,m nhập vào)
+) Sửa Mang2c[20][20] thành Mang2c[4][5] và nhập n=4,m=5 thì kết quả chính xác. Tuy nhiên với n,m khác thì kết quả lại không chính xác nữa.

Trên đây là những thắc mắc của em, rất mong được mọi người giải đáp. Em xin cảm ơn!

Bạn lên youtube xem lại bài về con trỏ của anh Đạt đi.

Bạn có thể cho mình xin link yb của anh ấy được không. Vì mình mới tham gia diễn đàn nên chưa biết anh ấy.

Lên youtube và gõ dạy nhau học thôi. ở công ty chặn youtube. thật là buồn quá man

1 Like

bạn khai báo mảng tĩnh int Mang2c[20][20]; nên hệ điều hành sẽ cấp phát bộ nhớ cho 20 phần tử int tương ứng với một hàng rồi mới chuyển sang hàng tiếp theo,
khi truy xuất dùng con trỏ bạn sử dụng : printf("%d ", ConTro[i]); khi đó con trỏ sẽ tăng địa chỉ liên tiếp và hiển thị ra giá trị tại những ô nhớ chưa có data.
vd: nhap mang 2:2 với arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[4] = 4; khi đó bộ nhớ sẽ được tổ chức như sau:
1 2 x x x x x x x (20 phần tử)
3 4 x x x x x x x (20 phần tử)

bạn có thể sửa lại như sau:
for(i=0;i<n;i++) {
for(j=0;j<m;j++)
{
printf("%d", *(ConTro + i * 20 + j));
}
}

Thanks bạn rất nhiều :blush:
Thật sự tài liệu của mình đang dùng không trình bày vấn đề này kỹ càng như vậy đâu.
Giải thích của bạn rất dễ hiểu, mình đã ngộ ra vấn đề rồi :yum:

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