Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: giải thích kiểu con trỏ

  1. #1
    Ngày gia nhập
    10 2008
    Bài viết
    6

    Mặc định giải thích kiểu con trỏ

    các anh giải thích giùm em kiểu dùng con trỏ

    1) ta dùng nó trong những trường hợp nào ?

    2) trong kiểu con trỏ cách truyền tham số và dữ liệu thông qua địa chỉ biến có khác gì với các cách mà ta vẫn thường dùng------ ví dụ ( nếu có càng tốt)

    3) ý nghĩa của việc dùng con trỏ nó có ích lợi gì không
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    1,3) Rất nhiều trường hợp để dùng con trỏ, nhất là khi xử lý chuỗi, mảng. Mình nghĩ bạn cứ code rồi sẽ tự biết khi nào dùng, đừng có đắn đo suy tính làm gì cho mệt.
    2) Cách mà ta vẫn thường dùng là cách nào ?
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    09 2008
    Bài viết
    0

    Mình sẽ gõ nguyên 1 phần về Hàm có tham số là con trỏ cho bạn tham khảo :



    Chúng ta xét ví dụ sau.
    Code:
    #include <stdio.h>
    void hoan_vi(int a, int b); /*nguyên mẫu hàm, prototype*/
    main()
    { int n=10, p=20;
       printf("Trước khi gọi hàm : %d  %d\n",n,p);
       hoan_vi(n,p);
       printf("Sau khi gọi hàm : %d  %d\n",n,p);
    }
    
    void hoan_vi(int a,int b)
    { int t;
       printf("Trước khi hoán vị : %d  %d\n",a,b);
       t=a;
       a=b;
       b=t;
       printf("Sau khi hoán vị : %d  %d\n",a,b);
    }
    Chương trình này cho kết quả sau:
    Trước khi gọi hàm : 10 20
    Trước khi hoán vị : 10 20
    Sau khi hoán vị : 10 20
    Sau khi gọi hàm : 10 20

    Như thế chúng ta nhận thấy kết quả trước và sau khi gọi hàm không có sự thay đổi.

    Phân tích: Hàm hoan_vi nhận 2 giá trị tham số tương ứng với 2 tham sô hình thức là a và b. Nó sẽ thực hiện việc hoán đổi giá trị của 2 tham số này. Song chúng ta thấy khi quay trở về chương trình chính, chúng ta không thấy dấu vết gì của sự hoán vị này đối với 2 tham số thực sự là n và p.

    Thực vậy khi gọi hàm, 2 biến n và p sẽ được sao chép giá trị để dùng cho hàm hoan_vi. Như vậy hàm sẽ sao ra 1 bản khác để dùng nên bản gốc không bao giờ bị thay đổi. Hiện tượng sao mượn giá trị này được gọi là sao mượn dùng cục bộ trong hàm ở vị trí 2 tham số hình thức a và b. Đó chính là lí do vì sao kết quả trước và sau khi gọ hàm đều như nhau. Như thế hàm hoan_vi không giải quyết được yêu cầu đặt ra.

    Để giải quyết được vấn đề này chúng ta sẽ sử dụng tham số là con trỏ. Việc thay đổi giá trị của nhiều tham số thông qua các hàm có thể được thực hiện thông qua việc truyền giá trị địa chỉ có tham số đó cho hàm, địa chỉ của tham số chứ không phải giá trị của tham số. Khi đó chúng ta có thể thay đổi được giá trị của tham số đó.

    Chúng ta viết lại hàm hoán vị hai biến sử dụng truyền địa chỉ cho hàm:
    Code:
    #include <stdio.h>
    void hoan_vi(int *a, int *b); 
    main()
    { int n=10, p=20;
       printf("Trước khi gọi hàm : %d  %d\n",n,p);
       hoan_vi(&n,&p);
       printf("Sau khi gọi hàm : %d  %d\n",n,p);
    }
    
    void hoan_vi(int *a,int *b)
    // a và b bây giờ là 2 địa chỉ
    { int t;
       printf("Trước khi hoán vị : %d  %d\n", *a, *b);
       t= *a;  /* t nhận giá trị chứa trong địa chỉ a */
       *a = *b;
       *b =t;
       printf("Sau khi hoán vị : %d  %d\n", *a, *b);
    }
    Kết quả nhận được như mong muốn:
    Trước khi gọi hàm : 10 20
    Trước khi hoán vị : 10 20
    Sau khi hoán vị : 20 10
    Sau khi gọi hàm : 20 10

    Chúng ta hãy chú ý 2 kí hiệu:
    *a đọc là giá trị tại địa chỉ a, là kí hiệu giá trị được lưu trữ trong bộ nhớ có địa chỉ là a.
    &a đọc là địa chỉ của a, là kí hiệu địa chỉ bộ nhớ chứa giá trị a.


    Câu hỏi đặt ra là : khi nào thì dùng tham số là con trỏ? Thực ra, trong số các tham sô của một hàm, ta chia ra làm 2 loại. Loại thứ nhất là các tham số các giá trị cần truyền vào cho hàm, gọi là tham số vào. Loại thứ hai là các tham số dùng để chứa kết quả mới nhận được, gọi là tham số ra. Ví dụ, cần lập một hàm để giải phương trình bậc 2 (ax2 + bx + c = 0), thì các tham số vào sẽ là a,b,c; còn các tham số ra sẽ là các nghiệm x1 và x2. Như thế, các tham số x1 và x2 phải sử dụng kiểu con trỏ để nhận giá trị



    --------------------------------------------------------

    mong bạn đọc thật kĩ, bài này trả lời hầu hết các câu hỏi bạn đã đặt ra {ngồi gõ cũng mệt lắm quá}.
    Hy vọng là giúp được bạn !
    --------

  4. #4
    Ngày gia nhập
    10 2008
    Bài viết
    14

    vấn đề cơ bản là bạn phải hủi dc cách thức HDH cấp phát bộ nhớ cho trương trình. Nôm na là khi đó bạn sẽ có 2 vùng nhớ 1 là stack và 2 là h... cai này tui quên mất tên của nó rồi. Khi thể hiện lớp sẽ dc tao ra trên h... còn con trỏ trỏ đến nó thì nằm trong stack.

    Tóm lại để trả lời 3 câu hỏi của bạn bạn chỉ cần tìm hủi sâu một chút về cơ chế khi một trương trình dc gọi OS hành động thế nào với nó tự nhiên bạn sẽ hủi giá trị của con trỏ. (và tham chiếu...)

    Còn ví dụ để hủi thì tôi nghĩ cái đó là skill mà bạn cần phải kinh qua thì mới thấy thấm.
    linhdkl
    -------------------------------------------------------------------------------------------
    linhdkl at gmail.com
    http://linhdkl.blogspot.com

  5. #5
    Ngày gia nhập
    09 2008
    Nơi ở
    Kĩ viện
    Bài viết
    169

    Quan trọng nhất là không dùng con trỏ thì đừng mơ tới chuyện cấp phát động . Còn vùng nhớ mà một đối tượng sử dụng khi được cấp phát động là heap. Nếu không có con trỏ thì một đối tượng tạo ra sẽ bị chém ngay khi ra khỏi "nơi tạo ra nó" mà không cần biết là có ai cần nữa hay không.

    À mà nếu chỉ để một method(function bây giờ ngoài main ra còn cái nào nữa đâu, người ta chuyển qua sử dụng object hết rồi) thao tác trực tiếp được với biến ngoài phạm vi của nó thì người ta xài tham chiếu chứ xài con trỏ làm gì bạn?. Con trỏ chỉ nên phục vụ cho mục đích cấp phát động thôi, râu ông nọ cắm cằm bà kia thế không hay đâu.

    Edit:

    Đọc lại thấy bạn có vẻ không hiểu lắm về vụ này, thôi thì.
    @linhdeptrai: định nghĩa của bạn...

    Khi một đối tượng được tạo ra thì nó nằm ở đâu?. Câu trả lời là "tùy vào cách bạn tạo nó".
    Nếu bạn tạo một object kiểu này chẳng hạn.
    Code:
    ClassName ObjectName
    ;
    Thì nó sẽ nằm trên stack. Có nghĩa là nó chỉ sống trong phạm vi tạo ra nó(nếu tạo bên trong một method thì return cái là thôi xong, nếu là một thuộc tính của một instance của một class thì khi instance đó bị delete nó cũng đi theo.

    Còn nếu tạo kiểu này.
    Code:
    ClassName* ptr = new ClassName();
    Thì object đó sẽ nằm trên heap, nghĩa là nó sẽ không bị chém cho tới khi nào ta delete nó hoặc kết thúc chương trình(để đến kết thúc chương trình thì người ta nói chương trình của bạn bị "memory leak", tưc slaf phải nhờ OS nó delete hộ(trừ DOS), lúc đấy là có chuyện để mà nói rồi ).

    Còn nếu tạo kiểu này.
    Code:
    static ClassName ObjectName
    ;
    Thì nó sẽ được tạo bởi "bộ khởi dựng tĩnh"(cái tên tiếng anh dài thượt quên mất rồi :(). Và bị chém khi kết thúc chương trình(cái này thì lại không phải là leak, tóm lại, bạn cũng chưa cần biết leak là cái gì vội, chỉ cần biết là nếu có ai đó bảo chương trình của mày bị leak rồi thì hãy để tâm tới mấy con trỏ).
    Đã được chỉnh sửa lần cuối bởi NamVoDang : 24-10-2008 lúc 02:29 PM.
    Phá toái hư không - Bạch nhật thăng thiên.

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

    Mặc định giải thích kiểu con trỏ

    khi nào thì dùng tham số là con trỏ?
    - Khi dùng linklist->bắt buộc dùng.
    - Còn lại dùng ref hết cũng chẳng sao, just matter of style.

  7. #7
    Ngày gia nhập
    10 2008
    Bài viết
    14

    @NamVoDang : Thanks so much ...
    "Biết nhiều, biết ít... khó biết đủ ... "
    linhdkl
    -------------------------------------------------------------------------------------------
    linhdkl at gmail.com
    http://linhdkl.blogspot.com

  8. #8
    Ngày gia nhập
    10 2008
    Bài viết
    14

    Trích dẫn Nguyên bản được gửi bởi NamVoDang Xem bài viết
    .... tóm lại, bạn cũng chưa cần biết leak là cái gì vội, chỉ cần biết là nếu có ai đó bảo chương trình của mày bị leak rồi thì hãy để tâm tới mấy con trỏ).
    ==> Bội thực vì tạo ra quá nhìu mà không giải phóng bộ nhớ do con trỏ nắm dữ...
    không nhầm chứ ???
    linhdkl
    -------------------------------------------------------------------------------------------
    linhdkl at gmail.com
    http://linhdkl.blogspot.com

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

    - Thật ra trong C không có khái niệm tham chiếu, nên truyền vào hàm chỉ có thể là con trỏ. Lấy gcc ra chạy thử là cậu biết liền
    - Cái mà NVD đề cập là C++, vì C++ có 2 cách tham chiếu và con trỏ.
    - C++ có rất nhiều lựa chọn cho pointer trong cấp phát động thay thế naked-pointer "new"
    shared_ptr<>, auto_ptr<>, scoped_ptr<>, smart_ptr<>.

  10. #10
    Ngày gia nhập
    09 2008
    Nơi ở
    Kĩ viện
    Bài viết
    169

    Lạy chúa, C với C++, hix, chẳng nhẽ bây giờ mỗi lần viết chương trình C lại phải xem xét xem có được xài hay không hả trời :(.

    ==> Bội thực vì tạo ra quá nhìu mà không giải phóng bộ nhớ do con trỏ nắm dữ...
    không nhầm chứ ???
    Không nhầm luôn . death note của C đấy. Khắc phục thì như R2 nói đấy, xài smartpointer.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Phá toái hư không - Bạch nhật thăng thiên.

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

  1. Cung cấp giấy ik plus, Paper One, Plus A+, Double A, Giấy Thái Lan, Giấy Bãi Bằng, bìa màu, băng dính, mica các loại
    Gửi bởi dungptvietthanh trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 07-06-2013, 04:05 PM
  2. Chung cư Đại Thanh giảm sốc 10tr/vnđ cho các căn hộ. giảm và liên tục giảm…!!
    Gửi bởi lanthanh91 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 09-10-2012, 10:27 AM
  3. Trả lời: 0
    Bài viết cuối: 06-08-2012, 07:01 PM
  4. Trả lời: 0
    Bài viết cuối: 04-08-2012, 03:08 PM
  5. Trả lời: 0
    Bài viết cuối: 24-05-2012, 04:04 PM

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