Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Cho mình hỏi sự khác biệt giữa con trỏ

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

    Mặc định Cho mình hỏi sự khác biệt giữa con trỏ

    Mình có đoạn code minh họa sau
    C++ Code:
    1. #include "iostream.h"
    2. #include "conio.h"
    3. class sv
    4. {
    5. private :
    6.   int masv;
    7.   char ht[30];
    8. public :
    9.   void input()
    10.     {
    11.     cout<<"\n Nhap MASV :";
    12.     cin>>masv;
    13.     cout<<"\n Nhap ten :";
    14.     cin.ignore(1);cin.get(ht,30);
    15.     }
    16.   void output()
    17.     {
    18.     cout<<"\n Thong tin sinh vien :";
    19.     cout<<"\n Ma SV : "<<masv<<endl<<" Ho ten :"<<ht;
    20.     }
    21. };
    22.  
    23. void main()
    24. {
    25. sv *p;
    26. p->input();
    27. p->output();
    28. getch();
    29. }

    Ở chương trình trên đoạn code
    C++ Code:
    1. sv *p;
    2. p->input();
    3. p->output();
    Mình thay thành
    C++ Code:
    1. sv a;
    2. a.input();
    3. a.output();

    Hai cách trên mình đều thực hiện được thao tác như nhau
    nhưng mình chưa hiểu sự khác nhau khi sử dụng *p va a là như thế nào
    Đã được chỉnh sửa lần cuối bởi ddhung : 25-12-2008 lúc 09:26 AM.

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

    C++ Code:
    1. sv *p;
    2. p->input();
    3. p->output();
    - Cái này con trỏ chưa khởi tạo làm sao gọi hàm được
    - Còn nếu khởi tạo đúng thì 2 cách gọi hàm : 1 cái dùng con trỏ 1 cái dùng không dùng con trỏ thế thôi !

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

    - Cái này con trỏ chưa khởi tạo làm sao gọi hàm được
    Cái này mình chạy như vậy mà nó vẫn chạy bt mà

    Ý mình muốn hỏi công dụng của chúng trong mỗi TH là giống nhau hoàn toàn hay khác nhau .
    Con trỏ dụng trong TH nào , và không dùng con trỏ dùng trong TH nào thì cần thiết

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

    Cái này mình chạy như vậy mà nó vẫn chạy bt mà
    Chắc cậu dùng TC++, cái này là sai, và chắc chỉ có thằng TC++ thì nó cho chạy kiểu trời đánh này !
    Ý mình muốn hỏi công dụng của chúng trong mỗi TH là giống nhau hoàn toàn hay khác nhau .
    Con trỏ dụng trong TH nào , và không dùng con trỏ dùng trong TH nào thì cần thiết
    - Trong trường hợp của cậu thì cái nào cũng vậy, vì nó đơn giản thì dùng con trỏ cũng chẳng mang ý nghĩa gì nhiều.
    - Trong trường hợp nếu cậu có 1 mãng các sv thì cậu chỉ khởi tạo 1 con trỏ mà khỏi cần tên đối tượng vì lúc đó giả nếu cậu có 1 vòng for lặp thì làm sao cậu thay đổi tên từng đối tượng mỗi lần for lặp lại được -> mãng cũng là 1 kiểu của con trỏ đó thôi !
    Hoặc khi cậu học đến đa hình thì cậu sẽ thấy sử dụng con trỏ uyển chuyển hơn, không phải hard-code.
    - Một ví dụ để cậu hiểu rõ hơn ví dụ tui đang viết 1 GUI programming dùng GTK+ :
    Java Code:
    1. for( int i = 0; i < 4; ++i )
    2. {
    3.     GtkWidget* button;
    4.     GtkWidget* label;
    5.     std::ostringstream ostr;
    6.     ostr << "Tab " << i + 1;
    7.                
    8.     label = gtk_label_new( ( ostr.str() ).c_str() );
    9.     button = gtk_button_new_with_mnemonic( "_Next Tab" );
    10.     gtk_notebook_append_page( GTK_NOTEBOOK( notebook ), button, label );
    11.     gtk_container_set_border_width( GTK_CONTAINER( button ), 10 );
    12.    
    13.     g_signal_connect(
    14.         G_OBJECT( button ),
    15.         "clicked",
    16.         G_CALLBACK( next_tab ),
    17.         static_cast< gpointer >( notebook )
    18.     );
    19. }
    Vì GtkWidget* là 1 abstract base class nên khi tui cần khởi tạo thằng nào chỉ cần gọi đúng tên hàm của nó mà không cần biết bản thân bên trong implementation của nó là gì, cứ dùng 1 con trỏ Base xử lý hết và làm cho code nó uyển chuyển hơn.
    Đã được chỉnh sửa lần cuối bởi rox_rook : 25-12-2008 lúc 04:03 PM.

  5. #5
    No Avatar
    ngocbig Khách

    Chắc cậu dùng TC++, cái này là sai, và chắc chỉ có thằng TC++ thì nó cho chạy kiểu trời đánh này !
    Không chỉ TC++ mà cả GCC. Thật hài hước.

    VC++ thì nhất quyết nói KHÔNG!

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

    Mặc định Cho mình hỏi sự khác biệt giữa con trỏ

    Không chỉ TC++ mà cả GCC. Thật hài hước.

    VC++ thì nhất quyết nói KHÔNG!
    Cái này nếu có chạy đúng ra kết quả thì có TC++ ở Dos mode( Cái này 1 lần có đọc nhưng giờ thì quên là tại vì sao ). Trên Win thì chắc là không thể không dính run-time được. Vì nó chưa khởi tạo thì compiler-time sẽ không có sai nhưng khi run-time thì chắc chắn sẽ bị segment-fault bên Linux hay access-violation bên Window. Tui nghĩ là gcc không thể không bị gì được.

  7. #7
    No Avatar
    ngocbig Khách

    Lúc đầu đọc tui cũng nghĩ làm gì compiler cho phép access đến p (vd trên). Test lại thấy đúng là gcc cho phép. Thật buồn cười. Nhưng test với VC++ thì không cho. Bạn cứ thử đi.

  8. #8
    Ngày gia nhập
    11 2008
    Nơi ở
    Neverland
    Bài viết
    48

    GCC cho phép nhưng nó không trả về giá trị là chương trình thoát tốt :
    C++ Code:
    1. #include <iostream>
    2. #include <conio.h>
    3. using namespace std;
    4.  
    5. class sv
    6. {
    7. private :
    8.   int masv;
    9.   char ht[30];
    10. public :
    11.   void input()
    12.     {
    13.     cout<<"\n Nhap MASV :";
    14.     cin>>masv;
    15.     cout<<"\n Nhap ten :";
    16.     cin.ignore(1);cin.get(ht,30);
    17.     }
    18.   void output()
    19.     {
    20.     cout<<"\n Thong tin sinh vien :";
    21.     cout<<"\n Ma SV : "<<masv<<endl<<" Ho ten :"<<ht;
    22.     }
    23. };
    24.  
    25. int main()
    26. {
    27.     sv *p;
    28.     p->input();
    29.     p->output();
    30.     getch();
    31.     return 0;
    32. }
    Chạy đoạn Code trên bằng CodeBlock nó sẽ trả về giá trị khi kết thúc chương trình không phải là 0 chương trình process terminate --> có lỗi . hehe .
    Đã được chỉnh sửa lần cuối bởi trung_dk070384 : 25-12-2008 lúc 06:35 PM.
    I'm superman

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

    Cảm ơn các bác đã giúp đỡ nhưng em làm phiền các bác chút
    C++ Code:
    1. #include "iostream.h"
    2. #include "conio.h"
    3. class sv
    4. {
    5. private :
    6.   int masv;
    7.   char ht[30];
    8. public :
    9.   void input()
    10.     {
    11.     cout<<"\n Nhap MASV :";
    12.     cin>>masv;
    13.     cout<<"\n Nhap ten :";
    14.     cin.ignore(1);cin.get(ht,30);
    15.     }
    16.   void output()
    17.     {
    18.     cout<<"\n Thong tin sinh vien :";
    19.     cout<<"\n Ma SV : "<<masv<<endl<<" Ho ten :"<<ht;
    20.     }
    21. };
    22.  
    23. void main()
    24. {
    25. sv *p;
    26. p=new sv[4];
    27. for(int i=0;i<4;i++)
    28. p[i]->input();
    29. for(int i=0;i<4;i++)
    30. p[i]->output();
    31. getch();
    32. }

    Đoạn mã đã sửa
    C++ Code:
    1. sv *p;
    2. p=new sv[4];
    3. for(int i=0;i<4;i++)
    4. p[i]->input();
    5. for(int i=0;i<4;i++)
    6. p[i]->output();
    7. getch();

    em sửa như vậy thì khi chạy chương trình lại báo lỗi

    nhưng sửa thành
    C++ Code:
    1. sv *p;
    2. p=new sv[4];
    3. for(int i=0;i<4;i++)
    4. p[i].input();
    5. for(int i=0;i<4;i++)
    6. p[i].output();
    7. getch();
    thì lại chạy bt

    Như vậy mình vẫn chưa thể phân biệt được
    C++ Code:
    1. p->input();// có dấu ->
    2. a.input();// Có dấu .


    Các bác có thể giải thích rõ chỗ này được không ?
    Đã được chỉnh sửa lần cuối bởi ddhung : 25-12-2008 lúc 08:32 PM.

  10. #10
    Ngày gia nhập
    11 2008
    Nơi ở
    Neverland
    Bài viết
    48

    Bạn chưa hiểu rõ về con trỏ rồi thử cái này xem :
    C++ Code:
    1. #include <cstdlib>
    2. #include <iostream>
    3. using namespace std;
    4.  
    5. class sv
    6. {
    7. private :
    8.   int masv;
    9.   char ht[50];
    10. public :
    11.   void input()
    12.     {
    13.         cout << "\nNhap MASV :";
    14.         cin >> masv;
    15.         cin.ignore(1);
    16.         cout << "\nNhap ten :";
    17.         cin.getline(ht,50,'\n');
    18.         cin.clear();
    19.     }
    20.   void output()
    21.     {
    22.         cout << "\nThong tin sinh vien :";
    23.         cout << "\nMa SV : " << masv << endl << "Ho ten :" << ht << endl;
    24.     }
    25. };
    26.  
    27. int main()
    28. {
    29.     sv *p = new sv[4];
    30.     for (int i = 0;i < 4;i++)
    31.         (p + i)->input();
    32.     for (int i = 0;i < 4;i++)
    33.         (p + i)->output();
    34.     delete []p;
    35.     system("pause >> NULL");
    36.     return 0;
    37. }

    Với p là con trỏ thì như ví dụ trên p[i] tương đương với *(p + i) --> dùng p[i]->input() sao được p là con trỏ , p + i là con trỏ với i hằng số nhưng p[i] là giá trị được trỏ tới bởi con trỏ (p + i) .
    Đã được chỉnh sửa lần cuối bởi trung_dk070384 : 25-12-2008 lúc 08:37 PM.
    I'm superman

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