Follow us on...
Follow us on Twitter Follow us on Facebook Watch us on YouTube

Giúp các bé đáng thương ấy với

Gameshow “Ai Là Triệu Phú” trên VTV đang chờ đón bạn – Tải ngay!

Bán đấu giá ủng hộ từ thiện

Ngập tràn ưu đãi cho tín đồ công nghệ tại sony show 2014

Chiêm ngưỡng BaoMoi đẹp "tuyệt diệu" trên Windows Phone

Tin tức công nghệ mới
kết quả từ 1 tới 6 trên 6
  1. #1
    nh0ck0n10B's Avatar
    nh0ck0n10B vẫn chưa có mặt trong diễn đàn Rìu Vàng
    Tham gia
    Jan 2008
    Đến từ
    Đông Anh - HN
    Bài
    926
    Cảm ơn
    138
    Điểm
    1.708/302 bài viết

    Default [C++] Mảng 2 chiều và Cấp phát động cho con trỏ cấp 2

    Mảng là tập hợp các phần tử cùng kiểu, nằm liên tiếp nhau trong bộ nhớ ảo. Bộ nhớ cấp phát cho một mảng luôn là một dài ô nhớ liên tục từ phần từ đầu tiên tới phần tử cuối cùng trong mảng, dù là 1 chiều hai chiều hay n-chiều.

    Với cấp phát động: Ta phải hiểu theo đúng bản chất của nó, cấp phát động cho con trỏ cấp 2, khác với cấp phát tĩnh cho mảng 2 chiều. Phân tích một chút:
    - Mảng hai chiều p[Rows][Cols], hiểu theo cách trìu tượng, nó có thể biểu diễn một ma trận với Rows hàng và Cols cột.
    - p[Rows][Cols], có thể hiểu nó giống như là một mảng một chiều mà mỗi phần tử của nó là một mảng một chiều khác.

    VD: Sau đây là 2 cách biểu diễn 1 mảng 2 chiều bản chất giống hêt nhau, nhưng thể hiện theo 2 cách hiểu khác nhau. (Cấp phát tĩnh)

    PHP Code:
    int arr[5][10]; //Mảng hai chiều arr[5][10] 
    Mảng được cấp phát như sau:
    Code:
    ------------------------------------
    [0,0] [0,1] [0,2].....[4,8] [4,9]
    ------------------------------------
    Với [0,1] là ô nhớ chứa arr[0][1]; kiểu int 4 bytes, vậy tổng kích thước dải nhớ là 5*10*4= 200 bytes

    PHP Code:
    typedef int intARR[10];
    intARR p[5]; // Mảng một chiều p[5] với kiểu dữ liệu intARR[10]; 
    Code:
    -------------------
    [0] [1] [2] [3] [4]
    -------------------
    Với [0] là ô nhớ chứa intARR[0]; kiểu dữ liệu intARR[10] kích thước 10*4= 40 bytes đủ để chứa một mảng int 10 phần tử. Vậy tổng kích thước dải nhớ là 5*40= 200 bytes

    - Tóm lại cách cấp phát ô nhớ không khác gì nhau. Các ô nhớ vẫn được cấp phát tĩnh và là một dải liên tiếp nhau. VẬY CẤP PHÁT CHO CON TRỎ CẤP 2 THÌ SAO.

    Nhiều bạn nghĩ rằng con trỏ cấp 2 và mảng 2 chiều là giống nhau, thực tế thì nó có thể sử dụng như nhau để biểu diễn một ma trận MxN, nhưng thực tế nó không hoàn toàn giống nhau. Để dễ hiểu, các bạn có thể nghĩ theo hướng thứ 2, tất cả là mảng 1 chiều ^^

    - Vậy nó khác cấp phát tĩnh thế nào

    Nhìn lại đoạn code này:

    [PHP]
    PHP Code:
    typedef int intARR[10];
    intARR p[5]; // Mảng một chiều p[5] với kiểu dữ liệu intARR[10]; 
    Mảng p chứa 5 phần tử, nếu hiểu theo tiêu chí con trỏ, mỗi phần từ của mảng p là một địa chỉ trỏ đến một mảng gồm 10 phần tử int.

    - Nếu cấp phát động

    PHP Code:
    int **p=new int*[5]; 
    Sẽ cấp phát một dải nhớ là 5*sizeof((int*)), ở win32 thì (int*) có giá trị là 4. Vậy nó sẽ cấp phát một dải nhớ liên tục có độ lớn là 4*5 = 20bytes cho con trỏ p.

    Cấp phát tĩnh: p[1], p[2] khong nằm cạnh nhau, chính xác thì p[2]-p[1] = đúng kích thước của mảng int[10]; còn trong cấp phát cho con trỏ 2 chiều thì p[2] nằm tiếp ngay sau p[1] trong dải ô nhớ.

    Code:
    ------------------------
    p[0] p[1] p[2] p[3] p[4]
    ------------------------

    Vậy thực tế p là một mảng 1 chiều, mà các phần tử có kiểu là (int*). và mảng đó là một dải ô nhớ liên tục. Nhưng đây là mảng con trỏ, vậy nó chỉ chứa được con trỏ mà thôi. Vậy muốn nó thành mảng 2 chiều thì làm thế nào.

    - Ta sẽ cấp phát cho mỗi phần tử của mảng p một dải nhớ int[10] để chứa mảng một chiều. Nó khác cấp phát tĩnh ở chỗ, các mảng int[10] này nằm rải rác, không nhất thiết phải liên tục nhau trong bộ nhớ.

    PHP Code:
        for(int i=0i<5i++)
            
    p[i]=new int[10]; 
    Điều này dẫn tới việc khi ********** bộ nhớ cho con trỏ cấp 2, ta phải ********** các dải nhớ cho từng con trỏ trước, sau đó ********** mảng con trỏ sau.

    VD:
    PHP Code:
        for(int i=0i<5i++)
            
    delete[] p[i];
        
    delete[] p
    Sau đây là ví dụ hoàn chỉnh về cấp phát và ********** bộ nhớ cho con trỏ cấp 2, để sử dụng như một mảng 2 chiều RxC

    PHP Code:
    /*
    TUTORIAL BY: ANHVNSE02067 - nh0ck0n10b
    */

    #include <iostream>
    using namespace std;
    #include <iomanip>
    #define R 5 //5 rows
    #define C 6 //6 col

    int main()
    {    
        
    int **p;
        
    /* Allocate memory */
        
    p=new int*[R];
        for(
    int i=0i<Ri++)
            
    p[i]=new int[C];

        
    /* Doing something ^^ */
        
    for(int i=0i<Ri++)
            for(
    int j=0j<Cj++)
                
    p[i][j]=(i+1)*(j+1);

        
    cout<<"Sample two-dimensions array: "<<endl<<endl;
        for(
    int i=0i<Ri++)
        {
            for(
    int j=0j<Cj++)
                
    cout<<setw(4)<<p[i][j];
            
    cout<<endl<<endl;
        }

        
    /*De-allocate memory*/
        
    for(int i=0i<Ri++)
            
    delete[] p[i];
        
    delete[] p;
        
    cout<<endl;
        
    system("pause");


    TUTORIAL BY: nh0ck0n10b - VN-ZOOM
    Anh em ủng hộ

  2. Có 14 thành viên cảm ơn nh0ck0n10B cho bài viết này:
    19-6 (22-10-2011), auauau97 (22-10-2011), audi.gucci (23-10-2011), buivankim2020 (14-09-2013), god250895 (17-05-2014), hiiphop (17-03-2013), minhtri92spk (09-03-2014), nguyenduyet3011 (13-12-2013), super_crazy_1991 (11-06-2012), thaingochieu (26-02-2012), V-Man (01-03-2014), vietphu267 (22-12-2013), zaizai_vjp (04-02-2013), Đam mê lập trình (22-10-2011)

  3. #2
    Đam mê lập trình's Avatar
    Đam mê lập trình vẫn chưa có mặt trong diễn đàn Thành viên đang bị kỷ luật
    Tham gia
    May 2011
    Đến từ
    Trên núi
    Bài
    428
    Cảm ơn
    433
    Điểm
    633/248 bài viết

    Default

    thanks , bài viết khá cơ bản .

  4. #3
    roocman9x's Avatar
    roocman9x vẫn chưa có mặt trong diễn đàn Búa Gỗ Đôi
    Tham gia
    Aug 2009
    Bài
    25
    Cảm ơn
    44
    Điểm
    7/7 bài viết

    Default

    thanks,hay quá

  5. #4
    hiiphop's Avatar
    hiiphop vẫn chưa có mặt trong diễn đàn Rìu Sắt
    Tham gia
    Nov 2008
    Đến từ
    Angiang, An Giang, Vietnam, Vietnam
    Bài
    172
    Cảm ơn
    45
    Điểm
    4/4 bài viết

    Default

    Bài viết rất bổ cho newbie như em. Rất cám ơn bác

  6. #5
    hp.codoc's Avatar
    hp.codoc vẫn chưa có mặt trong diễn đàn Rìu Vàng
    Tham gia
    Nov 2011
    Đến từ
    Cũng không biết nữa>>>
    Bài
    750
    Cảm ơn
    154
    Điểm
    62/46 bài viết

    Default

    Code:
    int **p=new int*[5];
    đang kiếm cái dòng này, bài viết hay
    ___________________
    Đời là bể khổ,
    Quay đầu là bờ ai ngờ là đại dương
    ____________________________________

  7. Có 1 thành viên cảm ơn hp.codoc cho bài viết này:
    minhtri92spk (09-03-2014)

  8. #6
    huypro14142's Avatar
    huypro14142 vẫn chưa có mặt trong diễn đàn Gà Con
    Tham gia
    Feb 2011
    Bài
    4
    Cảm ơn
    0
    Điểm
    0/0 bài viết

    Default

    thanks!!!!!!!!

 

 

Quyền sử dụng

  • Bạn không thể gửi chủ đề mới
  • Bạn không thể gửi trả lời
  • Bạn không thể gửi file đính kèm
  • Bạn không thể tự sửa bài viết của mình
  •