01/10/2018, 08:20

Hình như vậy thì con trỏ đang chỉ tới đâu thế ạ ? Và e tưởng là in giá trị của con trỏ là phải *p chứ ạ?

Tao Không Ngu. viết 10:20 ngày 01/10/2018

Hi Nguyen Trong Dung.
contro_int và mang_int là giống nhau.

Nguyen Trong Dung viết 10:31 ngày 01/10/2018

e tưởng gán con trỏ thì phải gán cho địa chỉ chứ ạ ?
muốn gán giá trị thì phải *p = < giá bị> hoặc tên biến.
sao ở đây gán con trỏ = nguyên cái mảng được ạ ?

Tao Không Ngu. viết 10:22 ngày 01/10/2018

Hi Nguyen Trong Dung.
Bạn viết mà @_@!

contro_int = (int *) mang_int;

Bạn xem lại về mảng trong C nhé.

Nguyen Trong Dung viết 10:23 ngày 01/10/2018

e k hiểu dòng đó nó có nghĩa là gì hết á. e đang tìm hiểu về pointer dùng trong mảng và chuỗi mà mông nung quá, a chỉ cho e với.

Tao Không Ngu. viết 10:26 ngày 01/10/2018

Hi Nguyen Trong Dung.
Mảng là 1 vùng nhớ liên tục. Trong C/C++ nó được quản lý bởi 1 con trỏ trỏ đến phần tử đầu của mảng. (tên mảng là 1 con trỏ.)
Bạn xem VD.

#include <stdio.h>

#define MAX_LENG 10

int main(int argc, char **argv) {
        int array[MAX_LENG];
        for(int index = 0; index < MAX_LENG; index++) {
                array[index] = index;
        }
        for(int index = 0; index < MAX_LENG; index++) {
                printf("%d ", array[index]);
        }
        printf("\n");
        for(int index = 0; index < MAX_LENG; index++) {
                printf("%d ", *(array + index));
        }
return 0;
}
Người bí ẩn viết 10:35 ngày 01/10/2018

Có 1 số cái bạn cần hiểu như sau:
mang_int[4][5] là một 2D array, nói cho dễ hiểu là gồm 4 dòng 5 cột, cách viết đúng hơn là như thế này:

int mang_int[4][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}, {16, 17, 18, 19, 20}};

contro_int là 1 con trỏ.

contro_int = (int *)mang_int; tức là cho con trỏ contro_int trỏ đến array mang_int. Vì mang_int là 1 2D array mà contro_int chỉ là con trỏ cấp 1 (tương đương với mảng 1 chiều) nên phải ép (int *). Lúc này contro_intmang_int là như nhau, chỉ khác là contro_int là mảng 1 chiều, còn mang_int là mảng 2 chiều.

Còn đoạn:

for (i = 0; i < 20; ++i) {
     printf("%d", contro_int[i]);
}

chỉ đơn thuần là việc in mảng 1 chiều ra màn hình thôi chứ có gì đâu, nó tương đương với cách viết như sau (không dùng array subscript):

for (i = 0; i < 20; ++i) {
     printf("%d", *(contro_int + i));
}

e tưởng gán con trỏ thì phải gán cho địa chỉ chứ ạ ?muốn gán giá trị thì phải *p = < giá bị> hoặc .sao ở đây gán con trỏ = nguyên cái mảng được ạ ?

cái này không phải gán mà là trỏ.

Nguyễn Xuân Phúc viết 10:25 ngày 01/10/2018

@BacNinh contro_int và mang_int chỉ có cùng giá trị thôi, không cùng bản chất, 1 thằng là int* 1 thằng là int** và lúc này cả 2 thằng đang trỏ đến vùng nhớ đầu tiên của mảng 2 chiều.
trong bài của bạn khai báo mảng tĩnh 2 chiều, mà mảng tĩnh 2 chiều thật chất là 1 block rowscols vùng nhớ liên tiếp, trong đó cứ mỗi 1 nhóm cols vùng nhớ sẽ dùng để lưu từng dòng trong ma trận (hay nói cách khác, nó cũng có thể xem là 1 mảng 1 chiều kích thước rowscols). Vì vậy khi bạn xuất contro_int[i] thì nó sẽ xuất ra giá trị ở vùng nhớ contro_int+i*sizeof(int). Nếu bạn tính ra, thì nó sẽ là phần tử mang_int[j][k] tương ứng với j = i / cols, k = i % cols (cols trong bài này là 5).

rogp10 viết 10:26 ngày 01/10/2018

Dòng đó ko cast vẫn chạy được thì phải. (mà thớt dùng sách gì mà có mấy câu hóc thế nhỉ)

mang_int là 2D còn contro_int là 1D Hình minh họa ngay đầu cho thấy rõ rằng C tổ chức bộ nhớ theo hàng ngang.

a[0] -> 0 1 2 3 4
a[1] -> 5 6 7 8 9

contro_int = (int*) mang_int; thực ra mang_int này có kiểu int[][5] và có giá trị như mang_int[0].

thành ra 0 1 2 3 4 5 6 7 8 9 …

Bài liên quan
0