Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: int **data; trong lập trình C/C++ là gì

  1. #1
    Ngày gia nhập
    03 2007
    Nơi ở
    Nhà hát của những giấc mơ
    Bài viết
    33

    Mặc định int **data; trong lập trình C/C++ là gì

    Trong bài tập thầy ra về có đoạn int **data;

    Mình chỉ nghe là con trỏ trỏ đến con trỏ

    Mọi người có thể giải thích giùm , và cho ví dụ đơn giản dễ hiểu được không

    Thanks

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Khi mà chúng ta sử dụng “truyền bằng con trỏ” để truyền con trỏ như 1 đối số cho hàm thì chỉ có bản sao của con trỏ được truyền mà thôi. Vậy truyền bằng con trỏ thực chất là chúng ta đang sử dụng truyền bằng trị. Phần lớn trong mọi trường hợp thì cũng không có vấn đề gì, nhưng vấn đề sẽ nảy sinh khi chúng ta có ý định sửa đổi con trỏ bên trong hàm đó, thay vì chỉnh sửa biến số mà nó đang trỏ tới bằng cách khử tham chiếu. Bởi vì khi chúng ta chỉnh sửa giá trị của con trỏ thì chúng ta chỉ chỉnh sữa cái bản sao của nó mà thôi, còn con trỏ gốc nó vẫn y nguyên. Xem đoạn code sau thì hiểu ngay :

    C++ Code:
    1. #include<iostream>
    2.  
    3. int g_One=1;
    4. void func(int* pInt);
    5.  
    6. int main()
    7. {
    8.   int nvar=2;
    9.   int* pvar=&nvar;
    10.   func(pvar);
    11.   std::cout<<*pvar<<std::endl; /*chỗ này vẫn in ra 2*/
    12.   return 0;
    13. }
    14.  
    15. void func(int* pInt)
    16. {
    17.   pInt=&g_One;
    18. }

    Sữa lại hàm func(), bây h nó nhận đối số có kiểu là con trỏ tới con trỏ

    C++ Code:
    1. void func(int** ppInt);
    2. {
    3.   int nvar=2;
    4.   int* pvar=&nvar;
    5.   func(&pvar);
    6.   ....
    7.   ....
    8.   return 0;
    9. }
    10. void func(int** ppInt)
    11. {
    12.   //thay đổi giá trị của con trỏ ppInt đang trỏ tới g_One
    13.   *ppInt=&g_One;
    14.   //có thể cấp phát động ở đây, tuỳ mục đích sử dụng của bạn
    15.   *ppInt=new int;
    16.   //thay đổi giá trị của biến mà con trỏ ppInt đang trỏ tới
    17.   **ppInt=3;
    18. }

    Nhận xét :
    -ppInt là con trỏ tới con trỏ, chúng ta sẽ không bao giờ chỉnh sửa giá trị của nó bởi vì nếu chúng ta làm vậy, chúng ta sẽ mất dữ liệu mà mà nó đang trỏ tới
    -*ppInt trỏ tới con trỏ, nếu chúng ta chỉnh sữa nó tức là chúng ta đang chỉnh sữa nội dung của con trỏ này cũng tức là 1 địa chỉ. Nói 1 cách khác, chúng ta đang thao tác con trỏ mà ppInt đang trỏ tới.
    -**ppInt chính là g_One bằng cách khử tham chiếu 2 lận

    Nhưng bây h xem thử ví dụ này, cũng là hàm func() nhưng đối số bây h sữa lại thành tham chiếu đến con trỏ :

    C++ Code:
    1. void func(int*& rpInt);
    2.  
    3. int main()
    4. {
    5.   int nvar=2;
    6.   int* pvar=&nvar;
    7.   func(pvar);
    8.   ....
    9.   return 0;
    10. }
    11. void func(int*& rpInt)
    12. {
    13.   //chỉnh sữa giá trị của con trỏ ppInt đang trỏ tới g_One
    14.   rpInt=&g_One;
    15.   //có thể cấp phát động, tuỳ mục đích sử dụng
    16.   rpInt=new int;
    17.   //chỉnh sữa biến mà con trỏ ppInt đang trỏ tới
    18.   *rpInt=3;
    19. }

    Nhận xét :
    -rpInt là tham chiếu của con trỏ.
    -*rpInt khử tham chiếu của con trỏ mà nó đang tham chiếu tới, vì vậy chúng ta có được giá trị của biến mà con trỏ đó đang trỏ đến .
    Bạn có thể vào codeproject để tham khảo nhiều ví dụ hơn. Thân !

  3. #3
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Đề nghị vào tut xem bài viết của DR cùng những thảo luận của TQN,Shinichi,NamQN ...
    Thứ 2 nữa là thank bác R2 nhà ta 1 phát.

    R2 là biệt danh tớ dành cho cậu đấy rox_rook nhé . Phải thank lại đấy.
    R2( ngoài v.tắt của ID cậu còn là 1 nhân vật khá tuyệt của star war 5 đấy. VIP đấy nhé ke ke)

  4. #4
    Ngày gia nhập
    03 2007
    Nơi ở
    Nhà hát của những giấc mơ
    Bài viết
    33

    Nhờ mọi người giúp em cách cấp phát mảng động 2 chiều có 5 hàng 10 cột

    Bằng C++ nhé , thanks

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Tạo mãng lưu các con trỏ, cấp phát cho từng con trỏ .
    C++ Code:
    1. #include <iostream>
    2.  
    3. int main()
    4. {
    5.     int row, col;
    6.     std::cout << "Enter [R,C] of array: ";
    7.     std::cin >> row >> col;
    8.    
    9.     int **array = new int *[row];
    10.     for(int x = 0; x < row; x++){
    11.         array[x] = new int[col];
    12.     }
    13.    
    14.     for (int x = 0; x < row; x++){    
    15.         delete[] array[x];
    16.     }
    17.         delete[] array;
    18.    
    19.     return 0;
    20. }

    Cách 2 dùng class :
    C++ Code:
    1. #include <iostream>
    2. template <class T>
    3. class Column
    4. {
    5.     T *pointer;
    6.   public:
    7.     Column(T *pointer):pointer(pointer){}
    8.  
    9.     T &operator[](unsigned i)
    10.     {
    11.         return pointer[i];
    12.     }
    13. };
    14.  
    15. template <class T>
    16. class Dynamic_2D_array
    17. {
    18.     unsigned row, col;
    19.     T *array;
    20.   public:
    21.       Dynamic_2D_array(unsigned row, unsigned col):
    22.       row(row),col(col),array(new T[row*col]){}
    23.  
    24.       Column<T> operator[](unsigned i)
    25.       {
    26.           return Column<T>(&array[row*i]);
    27.       }
    28.  
    29.       ~Dynamic_2D_array()
    30.       {
    31.           delete[] array;
    32.       }
    33. };
    34.  
    35. int main()
    36. {
    37.     Dynamic_2D_array<int> M(5,10);
    38.    
    39.     for(unsigned i = 0; i < 5; ++i){
    40.         for(unsigned j = 0; j < 10; ++j)
    41.             M[i][j]= 0;
    42.     }
    43.  
    44.     for(unsigned i = 0; i < 4; ++i){
    45.         for( unsigned j = 0; j < 5; ++j)
    46.             std::cout << M[i][j] << ' ';
    47.             std::cout << '\n';
    48.     }
    49.     return 0;
    50. }

Các đề tài tương tự

  1. [Core Data]Cách lấy data cho vào Cell của UITableView?
    Gửi bởi tiendung2992 trong diễn đàn Thắc mắc lập trình Objective-C
    Trả lời: 1
    Bài viết cuối: 12-07-2013, 11:51 AM
  2. Cách lấy data từ FCK lưu vào SQL trong MVC làm sao?
    Gửi bởi huuphuccg trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 0
    Bài viết cuối: 23-06-2012, 11:57 PM
  3. lấy data từ file xml, lưu vào Table trong dataset nhưng ko lấy được hết data
    Gửi bởi itmanhieu trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 19-08-2011, 06:23 PM
  4. Database đọc data lạc việt trong c#
    Gửi bởi manhhunguit trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 21-06-2011, 02:19 PM
  5. Làm sao để lấy data từ cổng COM trong lập trình C#?
    Gửi bởi truonguit trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 25-03-2011, 10:53 AM

Quyền hạn của bạn

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