30/09/2018, 16:55

Giải đáp thắc mắc dùm em về con trỏ cấp 2 và mảng 2 chiều

Nhờ mọi người giải thích dùm em dòng code sau ạ ?

int a[2][3];
int **p=new int *[2];
p[0]=a[0];
p[1]=a[1];

Em không hiểu từ dòng thứ 2 trở xuống , nhờ mọi người giúp đỡ . Cảm ơn vì đã đọc .

Thai Hoc Nguyen viết 19:00 ngày 30/09/2018

Dòng 2

int *p=new int[2];

Cấp phát mảng động bên C++ ( bạn cứ nghĩ là đã dc cấp 2 phần tử giống mảng 1 chiểu tĩnh )

p[0]=a[0];

Dòng này thì theo mình là có vẻ hơi sai Do là p[0] cũng chỉ là 1 phần tử 4 bytes mà ta ghi như trên cho thấy 1 dòng của a có 3 cột >> 12 bytes thì theo mình thế ko hợp lý cho lắm

dù vậy bạn cũng không cần thất vọng quá nếu bạn muốn con trỏ p có thể lưu hết tất cả thì bạn chỉ cần đổi lại

p = a[0];

thế là OK chúc bạn may mắn Có gì sai sót mong các bạn và anh chị em bỏ qua

Minh Hoàng viết 19:07 ngày 30/09/2018

int a[2][3];
int *p=new int[2];
p[0]=a[0];
p[1]=a[1];

bạn nên để p là con trỏ cấp 2 vì a[0] và a[1] là con trỏ.

an viết 19:06 ngày 30/09/2018

mình có chút nhầm lẫn , p là con trỏ cấp 2 đó bạn . Bạn giải thích dùm mình với nhé .

Minh Hoàng viết 19:03 ngày 30/09/2018

I moved a post to an existing topic: Duplicate posts will be moved here

Minh Hoàng viết 19:11 ngày 30/09/2018

int a[2][3];

Khi bạn khai báo 1 mảng 2 chiều như bên trên thì a chính là một con trỏ cấp 2. khi bạn gọi một thành phần thôi VD
a[0] thì nó sẽ tương đương với *a (dereference 1 lần).
a[1] thì tương đương với (*a)+1.
a[0] và a[1] cũng chỉ là con trỏ mà thôi. nếu bạn gọi a[0][0] thì nó sẽ bằng với **a (dereference 2 lần). Lúc này thì **a đã trỏ đến một ô chứa giá trị chứ không phải một ô nhớ nữa.

p/s: trong forum bạn không nên “up”, vì nó dư thừa, mọi người sẽ tự động vào trả lời cho bạn nếu bạn ghi đúng tiêu đề và nội dung rõ ràng.

an viết 19:11 ngày 30/09/2018
int a[2][3];
int **p=new int *[2];
p[0]=a[0];
p[1]=a[1];

Phần bạn giải thích mình đã hiểu ! Mình có thế tóm tắt lại như sau :
Ví dụ ta cho : a[0][0]=1
=> *a[0]=1 (trỏ tới dòng thứ 0,con trỏ cấp 1) <=> ** (a+0) =1 <=> **a = 1 (trỏ tới dòng 0 cột 0 , con trỏ cấp 2)

Ví dụ nữa : a[1][2]=1
=> *(a[1]+2) = 1 (trỏ tới dòng thứ 1 sau đó +2 đơn vị cho cột) <=> ((a+1)+2)=1 (từ vị trí [0][0] lần lượt +2 và +1 cho dòng và cột)

Không biết mình giải thích như vầy đã hợp lý chưa , mình cố tình trình bày chi tiết như vậy để ai đi ngang qua có thể vào cùng chia sẻ , tại mình thấy cái này khá là dễ quên theo mình.

Cái mình không hiểu là đoạn code này , mình không thể hình dung nó chạy step by step như thế nào !

   int **p=new int *[2];
        p[0]=a[0];
        p[1]=a[1];

ban đầu khởi tạo 1 con trỏ cấp 2 “p” , rồi cấp phát động cho nó ,có dấu " * " là sao ạ , mình k hiểu ?
con trỏ p là con trỏ cấp 2 trong khi đó p[0] <=> *p ? Vậy sao gọi nó là con trỏ cấp 2 dc ?

Nguyễn Minh Dũng viết 18:59 ngày 30/09/2018

@chienham1211 xem qua topic về markdown để sửa lại bài viết của mình đi nhé:

  • Cách post Code dùng Markdown trong Category Programming
  • Markdown là gì, sử dụng nó như thế nào?
Minh Hoàng viết 19:08 ngày 30/09/2018

Bạn đúng rồi đó. Có lẽ bây giờ không nên gọi là con trỏ cấp 2 (chỉ để gọi cách khai báo thì ok). Hiểu theo kiểu ô nhớ thì dễ hơn
Còn đoạn code ở bên dưới thì mình sẽ viết nó dài ra 1 tí

       int **p;
       *p=new int *[2];
       p[0]=a[0];
       p[1]=a[1];

con trỏ cấp 2 ở đây có nghĩa là bạn có một con trỏ, nó lại trỏ đến một con trỏ nữa.
thằng p sẽ được cấp phát một mảng gồm 2 con trỏ. 2 con trỏ này bạn có thể làm gì tùy thích. Có thể cấp phát cho nó một mảng để nó quản lý, hoặc chỉ là một ô nhớ để nó quản lý.
Bạn nên xem nó như các ô nhớ. Việc gọi tên có thể khó hình dung.

Bài liên quan
0