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ứ ạ?
Hỏi về giá trị của con trỏ
Hi Nguyen Trong Dung.
contro_int và mang_int là giống nhau.
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 ạ ?
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é.
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.
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;
}
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_int và mang_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));
}
cái này không phải gán mà là trỏ.
@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).
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 …

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