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ố 15 kết quả

Đề tài: khai báo và sử dụng con trỏ trong lập trình C?

  1. #1
    Ngày gia nhập
    11 2010
    Bài viết
    54

    Red face khai báo và sử dụng con trỏ trong lập trình C?

    đầu tiên là giới thiệu em mới học thôi nên có vài cái khái niệm chưa rõ ràng mọi người chỉ bảo giúp em

    em có bài tập về phần sử dụng con trỏ... đề bài là hãy nhập vào 1 xâu, in ra mỗi từ 1 dòng...



    ...
    char a[100],*p;
    int i,x;
    printf("hãy nhập vào xâu a");
    gets(a);
    p=a;
    x=strlen(a);
    for(i=0;i<x;i++)
    -----if((*p+i)==27)
    ----------printf("\n");
    -----else
    ----------printf("%c",(*p+i))
    getch();
    em làm vây là đúng hay sai ? các anh em giúp em nhé...

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

    còn có 1 thắc mắc nữa là em có thể trực tiếp khai báo giá trị cho con trỏ *p mà k cần trung gian qua mảng a được k ? nếu được thì khai báo thế nào ...

    thanks

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

    Hello em,

    - Con trỏ tới vị trí đầu của mãng trong C/C++ là con trỏ hằng ( không ++ hay -- ) được.
    - Cách dùng trực tiếp qua mãng là array[ i ], nhưng dùng con trỏ nhanh hơn dùng []
    - Em in ra string hay một end of line thì dùng puts() sẽ nhanh hơn printf()
    - Dùng gets() không có tham số cho độ dài max của chuỗi, dễ gây ra overflow, ví dụ em khai báo mãng a[100], nếu nhập 101, nó cũng không cho em biết tại sao sai. Dùng cin.getline() bên C++ từ <iostream> library.
    - Mới học không nên dùng magic number ( 27 ), nếu là space thì ghi ra cụ thể.
    Anh demo, không hiểu thì em cứ hỏi:
    C++ Code:
    1. #include <cstdio>
    2. #include <iostream>
    3.  
    4. int main()
    5. {
    6.     char input[100];
    7.     puts( "Enter a string: " );
    8.     std::cin.getline( input, 100 );
    9.  
    10.     char* p = input;
    11.     for( ;*p != '\0'; ++p )
    12.     {
    13.         printf( "%c", *p );
    14.         if( *p == ' ' )  // if there is a space, print it
    15.         {
    16.             puts( " " );
    17.         }
    18.     }
    19. }

  3. #3
    Ngày gia nhập
    11 2010
    Bài viết
    54

    std::cin.getline( input, 100 );
    cái nì em chưa hiểu lắm ... input là mảng ... 100 là giới hạn ... thế cái std:: nghĩa là j ?

    về con trỏ thì ở lớp thầy giảng hơi mơ hồ nên em vẫn bị nhầm lẫn giữa 2 khái niệm địa chỉ và giá trị của con trỏ...anh có thể giảng một chút cho em được k ? như cái ở đoạn printf("%c",*p) là giá trị của con trỏ hay là địa chỉ của con trỏ ?

    con trỏ có cách viết là (*p+i) đúng hay sai ? nếu đúng thì có phải là giá trị của con trỏ tại vị trí i phải k anh

    thân ^^

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

    Hello em again,

    p là địa chỉ mà p đang trỏ tới
    p là giá trị của địa chỉ đó

    std:: là viết tắt của standard template library, trong C++ có khái niệm namespace, nên các hàm trong C++ thường phải có prefex std::
    ( *p + i ) là sai vì em khử tham chiếu của p, khử tham chiếu nghĩa là *p, và cái này trả về giá trị của p đang trỏ tới, ví dụ p đang trỏ tới 'A' thì *p = 'A'. Mà 'A' trong C/C++ có giá trị 65, em láy nó + 1 thì cho ra 66 tức là 'B'. Code sẽ không báo lỗi vì cái này không có gì sai về mặt cú pháp, nhưng logic là sai.
    - Em lưu ý 2 cách ghi sau là như nhau :
    C++ Code:
    1. p[ i ] = *( p + i );

  5. #5
    Ngày gia nhập
    11 2010
    Bài viết
    54

    có thể em hiểu sai nhưng em thấy trong C có 2 khái niệm vị trí và giá trị của biến

    vị trí &a trong scanf("%c",&a);

    giá trị a trong printf("%c",a);

    vây đối với con trỏ thì như thế nào hả anh

  6. #6
    Ngày gia nhập
    04 2010
    Nơi ở
    Gò Vấp, HCMC
    Bài viết
    287

    Mặc định khai báo và sử dụng con trỏ trong lập trình C?

    đối với con trỏ thì thế này : int *p;
    scanf("%d",p);
    printf("%d",*p);
    Hoa Tử Đinh Hương Phụng Vũ Phi Y
    Skype: makemecryhp
    Email: makemecryhp@gmail.com
    Face : fb.com/yescaerosta

  7. #7
    Ngày gia nhập
    03 2010
    Nơi ở
    My Home
    Bài viết
    772

    Trích dẫn Nguyên bản được gửi bởi yscytd Xem bài viết
    đối với con trỏ thì thế này : int *p;
    scanf("%d",p);
    printf("%d",*p);
    Viết thế này là chết chương trình đấy

  8. #8
    Ngày gia nhập
    10 2009
    Nơi ở
    Close All
    Bài viết
    993

    Trích dẫn Nguyên bản được gửi bởi yscytd Xem bài viết
    đối với con trỏ thì thế này : int *p;
    scanf("%d",p);
    printf("%d",*p);
    Cái này hình như bạn nhầm.

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

    int *p;
    int q;
    p = q;
    scanf("%d",p);
    printf("%d",*p);

  10. #10
    Ngày gia nhập
    04 2010
    Nơi ở
    Gò Vấp, HCMC
    Bài viết
    287

    Trích dẫn Nguyên bản được gửi bởi tauit_dnmd Xem bài viết
    Cái này hình như bạn nhầm.
    chính xác ,
    tại trong C/C++ thì bọn mình sử dụng *p thường là mảng / chuỗi động hơn
    Hoa Tử Đinh Hương Phụng Vũ Phi Y
    Skype: makemecryhp
    Email: makemecryhp@gmail.com
    Face : fb.com/yescaerosta

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

  1. Tệp tin *.lib khác *.dll khác nhau như thế nào ?
    Gửi bởi ngusaomanoi trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 18-12-2012, 05:15 PM
  2. Những cách khai báo trong C#
    Gửi bởi dttrung trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 18-09-2012, 06:11 PM
  3. taị sao các biến static khi khai báo để dùng được lại phải khai báo lại trước hàm main ? ?
    Gửi bởi anhnpson trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 15-06-2011, 08:18 PM
  4. Lập trình C Thắc mắc về khai báo protoype và các hàm liên quan khi khai báo!
    Gửi bởi ganhim trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 15
    Bài viết cuối: 10-08-2010, 02:03 PM
  5. Sự khác nhau giữa các khai báo int, void, float trong khai báo hàm?
    Gửi bởi toend2008 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 06-05-2009, 07:19 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