Truyền tham trị và tham biến cho hàm

Khi một hàm mà được định nghĩa và khai báo trong chương trình thì hàm main(), các hàm khác và thậm chí hàm đó có thể gọi đến chính nó (đệ quy). Trong C/C++, có các cách truyền đối số (arguments) cho hàm như sau:

Truyền tham trị (dùng trong cả C và C++)

Khi truyền đối số kiểu tham trị, chương trình biên dịch sẽ copy giá trị của đối số để gán cho tham số của hàm (không tác động trực tiếp đến biến số truyền vào).

#include <stdio.h>
#include <conio.h>

int sum(int a, int b)
{
    a++;
    b++;
    return (a+b);
}
void main()
{
    int x =1, y = 2;
    int s = 0;
    s = sum(x, y); 
    printf("\n s = %d", s);
    printf("\n x = %d", x);
    printf("\n y = %d", y);
    getch();
}
Truyền tham trị cho hàm
Truyền tham trị cho hàm

Trong ví dụ này, ta định nghĩa và khai báo hàm sum() có kiểu trả về là int, 2 tham số a,b kiểu int. Khi gặp câu lệnh gọi hàm sum() trong hàm main(). Chương trình sẽ tạo ra 2 biến Local a,b trong hàm sum(). Giá trị của đối số x,y truyền vào sẽ được copy và gán tương ứng cho 2 tham số a,b
(a = 1,b = 2). Các câu lệnh tiếp theo trong hàm sum() chỉ thao tác trên 2 biến Local a,b. Do vậy kết quả là giá trị biến x = 1 , y = 2.

Truyền tham biến

Phương pháp truyền tham biến là cách truyền địa chỉ của đối số cho các tham số tương ứng của hàm được gọi. Với cách truyền tham biến, giá trị của đối số truyền vào có thể bị thay đổi bởi việc gọi hàm.
Truyền tham biến chia ra thành 2 loại : truyền con trỏ (dùng trong C và C++) , truyền tham chiếu (chỉ dùng trong C++)

Truyền con trỏ (dùng trong C và C++)

#include <stdio.h>
#include <conio.h>

void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
void main()
{
    int x = 2, y = 3;
    swap(&x, &y);
    printf("\nx = %d", x);
    printf("\ny = %d", y);
    getch();
}
Truyền con trỏ cho hàm
Truyền con trỏ cho hàm

Hàm swap() làm nhiệm vụ đổi chỗ 2 biến nguyên x,y truyền vào. Đối số truyền vào ở đây là địa chỉ 2 biến x,y (&x , &y). Trong hàm swap(), biến con trỏ a,b sẽ trỏ tới địa chỉ của biến x,y (a = &x, b = &y). Và *a và *b chính là giá trị của 2 biến x,y. Các câu lệnh tiếp theo:

temp = *a;
*a = *b;
*b = temp;

Ta thấy, hàm swap() đã thay đổi giá trị của đối số truyền vào.

Truyền tham chiếu (chỉ dùng trong C++)

#include <stdio.h>
#include <conio.h>

void swap(int &a, int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}
void main()
{
    int x = 2, y = 3;
    swap(x, y); 
    printf("\nx = %d", x);
    printf("\ny = %d", y);
    getch();
}
Truyền tham chiếu cho hàm
Truyền tham chiếu cho hàm

Hàm swap() cũng làm nhiệm vụ hoán đổi vị trí giữa 2 biến nguyên truyền vào. Trong C++ cho phép sử dụng biến tham chiếu.
+ Biến tham chiếu không được cấp phát bộ nhớ, không có địa chỉ riêng.
+ Nó dùng làm bí danh cho một biến (kiểu giá trị) nào đó và nó sử dụng vùng nhớ của biến này.
Trong hàm swap(), chương trình sẽ thực hiện lệnh gán sau:
int &a = x;
int &b = y;
a,b ở đây là bí danh của biến x,y. Tức là biến a,b sẽ dùng chung vùng nhớ với biến số x,y.
Các cậu lệnh được thao tác trên biến a,b hay cũng chính là thao tác trên biến x,y. Do vậy, hàm swap() sẽ thay đổi giá trị của đối số truyền vào.

 

Be the first to comment

Leave a Reply