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.
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;
}
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));
}
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 ạ ?
@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).
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à @_@!
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.
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:contro_int
là 1 con trỏ.contro_int = (int *)mang_int;
tức là cho con trỏcontro_int
trỏ đến arraymang_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àycontro_int
vàmang_int
là như nhau, chỉ khác làcontro_int
là mảng 1 chiều, cònmang_int
là mảng 2 chiều.Còn đoạn:
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):
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 ramang_int
này có kiểuint[][5]
và có giá trị nhưmang_int[0]
.thành ra 0 1 2 3 4 5 6 7 8 9 …