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

Đề tài: [Solved] Cần giải thích về hàm

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

    Smile [Solved] Cần giải thích về hàm

    đây là bài trộn mảng theo mình biết thì nếu hko dung con trỏ..thì hko lưu giữ đc kết quả khi ra khỏi hàm VD như bài trộn mảng này tại sao hko dùng đến con trỏ vẫn có thể sắp xếp mảng...mà khi ở ngoài hàm vẫn không bị thay đổi giá trị
    Code:
    #include<stdio.h>
    #include<conio.h>
    void tronmang(int a[],int n,int b[],int m)
    {
    int t=0,i,j,k;
     for(i=0;i<=m;i++)
       for(j=0;j<=(n+t);j++)
        if (b[i] <a[j])
         {
         for(k=(n+t);k>=j;k--)
          a[k+1]=a[k];
          a[j]=b[i];
          t++;
          break;
         }
        else if (j==n+t) a[++j]=b[i];
    }
    void main()
    {
    int i;
    int a[20]={1,3,5,7,11,16,18,19},n=7;
    int b[]={2,4,6,7,9,11,17,31},m=7;
    clrscr();
    tronmang(a,n,b,m);
    for(i=0;i<=m+n+1;i++)
    printf("%3d",a[i]);
    
    getch();
    }

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

    int a[], int b[] là con trỏ đó bạn
    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 2007
    Bài viết
    724

    Mèo con nói đúng trường hợp hỏi của bạn rồi. nhưng mình xin nói rõ hơn về 2 kiểu truyền giá trị cho một hàm.

    Nói cho rõ ra thì nó thế này.
    Tại sao khi bạn đưa vào một con trỏ thì sau khi thực hiện xong hàm đó nó lại làm thay đổi các giá trị mà bạn truyền vào cho nó? Và tại sao khi truyền dữ liệu vào hàm ta không dùng các kiểu có liên quan tới địa chỉ thì chẳng có gì thay đổi trong sau khi gọi hàm cả.???

    Nói cho rõ ra là khi chúng ta truyền dữ liệu vào một hàm vd:
    C Code:
    1. void Ham(int a);
    ở một đâu đó bạn gọi hàm trên.
    C Code:
    1. ...{ ...
    2. int b;
    3. Ham(b);
    4. ...
    5. }

    thì nó sẽ truyền giá trị của b vào thực hiện trong hàm Ham. giá trị này được chứa ở một ô nhớ khác không phải là địa chỉ của biến b cho nên khi ra khỏi hàm bạn sẽ không thấy biến b thay đổi gì cả.

    ví dụ 2:
    khai báo một hàm:
    C Code:
    1. void Ham(int &b)
    khi truyền vào cho nó là kiểu địa chỉ thì bạn sẽ đưa cho nó địa chỉ của biến được truyền vào và lúc này nó sẽ làm việc trên chính địa chỉ của biến đó.
    ví dụ ở một đâu đó bạn gọi hàm:

    C Code:
    1. Ham(c);

    lúc này cái mà truyền vào trong hàm Ham làm việc không phải là c nữa mà là địa chỉ của biến c. nên khi ra khỏi hàm giá trị của biên c sẽ thay đổi.


    chúc bạn thành công.

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

    thì nó sẽ truyền giá trị của b vào thực hiện trong hàm Ham. giá trị này được chứa ở một ô nhớ khác không phải là địa chỉ của biến b cho nên khi ra khỏi hàm bạn sẽ không thấy biến b thay đổi gì cả.
    - Nói đúng hơn là nó truyền vào 1 copy biến đó chứ tui thì không nghĩ có địa chỉ nào khác.
    - Với lại trong C không hề có truyền tham chiếu, chỉ có pointer thôi. Do cậu dùng compiler C++ dịch C nên cậu mới truyền đc tham chiếu kiểu đó. Pure C không có tham chiếu.
    - Và khi cậu truyền mãng vào hàm nó sẽ hiểu là truyền con trỏ ( mà con trỏ này trỏ tới phần tử đầu tiên của mãng ). Không có cách nào cậu có thể truyền tham trị trực tiếp qua pure array, vì mặc định nó là truyền con trỏ rồi. Cậu cứ thử thì sẽ rõ. Cách duy nhất để truyền tham trị cho mãng là dùng nó thông qua struct.
    C Code:
    1. #include <cstdio>
    2.  
    3. const int SIZE = 4;
    4.  
    5. struct G
    6. {
    7.     int ar[ SIZE ];
    8. };
    9.  
    10. void passACopyOfArray( G ob )
    11. {
    12.     int o;
    13.     for( o = 0; o < SIZE; ++o )
    14.     {
    15.         ob.ar[ o ] = 1;
    16.     }
    17. }
    18.  
    19. void printOutStruct( G ob )
    20. {
    21.     int o;
    22.     for( o = 0; o < SIZE; ++o )
    23.     {
    24.         printf( "%d ->", ob.ar[ o ] );
    25.     }
    26. }
    27.  
    28.  
    29. int main()
    30. {
    31.     G ob;
    32.     printf("\n Truyen tham tri !" );
    33.     printf("\n passACopyOfArray( ob ); " );
    34.     passACopyOfArray( ob );
    35.  
    36.     printf("\n In ra ket qua : \n" );
    37.     printOutStruct( ob );
    38.  
    39.     return 0;
    40. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 17-09-2008 lúc 08:14 AM.

  5. #5
    Ngày gia nhập
    07 2008
    Bài viết
    30

    thanks all.mình hỉu rùi

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

  1. [Solved] In kết quả dưới dạng phân số tối giản
    Gửi bởi pfc718 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 16-09-2008, 08:12 PM
  2. [ Solved ]Giải thuật Prim !
    Gửi bởi phubaby trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 23-04-2008, 11:07 AM
  3. [Solved]Lỗi cơ bản trong một thuật toán sắp xếp đơn giản
    Gửi bởi hacker_mubaohiem trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 21-03-2008, 06:35 PM
  4. Giả lập Norton Commander trong C++?
    Gửi bởi hirikarate trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 10-02-2007, 02:44 AM
  5. [ Solved ]Có một bài tập về ngày tháng năm bạn nào dúp mình giải với
    Gửi bởi vtniam trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 03-11-2006, 10:38 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