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

Đề tài: Vấn đề về con trỏ

  1. #1
    Ngày gia nhập
    03 2012
    Bài viết
    0

    Mặc định Vấn đề về con trỏ

    Em đang làm 1 hàm cắt 1 chuỗi từ vị trị cắt chuỗi từ a đến b.Chẳng hạn cắt chuỗi "hello" từ 1 đến 2 thì re "he".Em có 2 đoạn code.Một đoạn thì chạy ra.Một đoạn thì không.Em k hiểu sự khác nhau giữa 2 đoạn này.
    Code:
    main()
    {
          char d[10];
          char *s2=d;    
          char *s1="hello";     
          printf("%s",cat(s2,"hello",1,2));
          getch();      
    }
    char *cat(char *dest, const char *src,int a,int b){
         unsigned i,k;
         k=0;
         for (i=a; i<=b;i++){
             *(dest+k)=src[i];
              k++;        
         }
         return dest;
    }
    Đoạn trên chạy ra bình thường.Nhưng còn đoạn dưới thì không ra.


    Code:
    main()
    {
          char d[10];
          char *s2=d;    
          char *s1="hello";     
          printf("%s",cat(s2,"hello",1,2));
          getch();      
    }
    char *cat(char *dest, const char *src,int a,int b){
         unsigned i,k;
         k=0;
         for (i=a; i<=b;i++){
             *dest=src[i];
              dest++;      
         }
         return dest;
    }
    Mọi người giúp em với.

  2. #2
    Ngày gia nhập
    04 2011
    Nơi ở
    Hà Nội
    Bài viết
    253

    Trích dẫn Nguyên bản được gửi bởi seven_tt Xem bài viết
    Em đang làm 1 hàm cắt 1 chuỗi từ vị trị cắt chuỗi từ a đến b.Chẳng hạn cắt chuỗi "hello" từ 1 đến 2 thì re "he".Em có 2 đoạn code.Một đoạn thì chạy ra.Một đoạn thì không.Em k hiểu sự khác nhau giữa 2 đoạn này.
    Code:
    main()
    {
          char d[10];
          char *s2=d;    
          char *s1="hello";     
          printf("%s",cat(s2,"hello",1,2));
          getch();      
    }
    char *cat(char *dest, const char *src,int a,int b){
         unsigned i,k;
         k=0;
         for (i=a; i<=b;i++){
             *(dest+k)=src[i];
              k++;        
         }
         return dest;
    }
    Đoạn trên chạy ra bình thường.Nhưng còn đoạn dưới thì không ra.


    Code:
    main()
    {
          char d[10];
          char *s2=d;    
          char *s1="hello";     
          printf("%s",cat(s2,"hello",1,2));
          getch();      
    }
    char *cat(char *dest, const char *src,int a,int b){
         unsigned i,k;
         k=0;
         for (i=a; i<=b;i++){
             *dest=src[i];
              dest++;      
         }
         return dest;
    }
    Mọi người giúp em với.
    lệnh
    C Code:
    1. dest++;
    để tăng con trỏ dest lến 1 đơn vị (dest sẽ trỏ đến ô nhớ kế tiếp). sau khi kết thúc vòng lặp, dest sẽ không còn trỏ đến d[0] nữa (trong ví dụ của bạn, dest trỏ đến d[2] chưa được khởi tạo), vì vậy xâu in ra sẽ không được như ý muốn

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

    Code:
    main()
    {
          char d[10];
          char *s2=d;    
          cat(s2,"hello",1,2);  
          printf("%s",s2);
          getch();      
    }
    char *cat(char *dest, const char *src,int a,int b){
         unsigned i,k;
         k=0;
         for (i=a-1; i<b;i++){
             *dest=src[i];    
             dest++;          
         }
         return dest;
    }
    Nếu như mình ghi zậy nó vẫn ra.Mình hiểu ý của bạn rồi.Nhưng đoạn code này,chương trình sẽ xử lý thế nào..cảm ơn bạn nhiều

  4. #4
    Ngày gia nhập
    04 2011
    Nơi ở
    Hà Nội
    Bài viết
    253

    Trích dẫn Nguyên bản được gửi bởi seven_tt Xem bài viết
    Code:
    main()
    {
          char d[10];
          char *s2=d;    
          cat(s2,"hello",1,2);  
          printf("%s",s2);
          getch();      
    }
    char *cat(char *dest, const char *src,int a,int b){
         unsigned i,k;
         k=0;
         for (i=a-1; i<b;i++){
             *dest=src[i];    
             dest++;          
         }
         return dest;
    }
    Nếu như mình ghi zậy nó vẫn ra.Mình hiểu ý của bạn rồi.Nhưng đoạn code này,chương trình sẽ xử lý thế nào..cảm ơn bạn nhiều
    thêm null terminator vào là ok
    C Code:
    1. char *cat(char *dest, const char *src,int a,int b){
    2.      int i,k;
    3.      k=0;
    4.      for (i=a-1; i<b;i++){
    5.          *dest=src[i];    
    6.          dest++;          
    7.      }
    8.      *dest = '\0';
    9.      return dest;
    10. }
    đoạn code nguyên gốc không có null terminator, vì vậy không biết string dừng ở đâu, in sạch ra -> lỗi

  5. #5
    Ngày gia nhập
    03 2012
    Bài viết
    0

    Mình đang học về phần pointer nên còn nhiều thắc mắc lắm :( Trong trường hợp dưới đây mình k hiểu sao ra vậy nữa
    Code:
    #include <stdio.h>
    main()
    {
          int a=15;
          int *p;
          p=(int *)(a);
          printf("%d",p);      
          getch();
    }
    Thì nó xuất ra 15, nhưng khi ghi printf("%d",*p); thì nó lại k chạy.

  6. #6
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Mặc định Vấn đề về con trỏ

    C Code:
    1. // ép kiểu sai.
    2. //      p = (int *)(a);
    3.       p = (int *)(&a);
    4. // Hoặc đơn giản
    5.       p = &a;
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  7. #7
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Trích dẫn Nguyên bản được gửi bởi doicanhden Xem bài viết
    C Code:
    1. // ép kiểu sai.
    2. //      p = (int *)(a);
    3.       p = (int *)(&a);
    4. // Hoặc đơn giản
    5.       p = &a;
    Bạn ấy ép kiểu đúng đó Vì trường hợp ta tự gán giá trị cho con trỏ là có thể xảy ra.

    Ví dụ.

    Visual C++ Code:
    1.     int nValue = 10;
    2.     int nDiaChi = (int)&nValue;
    3.  
    4.     int* pPointer = (int*)nDiaChi;
    5.  
    6.     cout<< *pPointer <<endl; // 10

    Cơ bản là có thể bạn ta hiểu sai bản chất của con trỏ.

    Truy cập tới *p không được có thể do đối tượng kiểu int ( 2 bytes hoặc 4 bytes ) tại địa chỉ p không thể được truy cập.

  8. #8
    Ngày gia nhập
    04 2011
    Nơi ở
    Hà Nội
    Bài viết
    253

    ép kiểu không sai, nhưng sau khi ép kiểu p trỏ đến 1 vùng nhớ 0x000000F (không tồn tại). Đoạn code
    C Code:
    1. printf("%d", p);
    tương đương với đoạn code sau trong C++
    C++ Code:
    1. cout << (int) p;
    còn ví dụ của bạn luc13aka47 đưa ra khác so với những gì mà bạn seven_tt định làm

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