57
C
CH
HƯ
ƯƠ
ƠN
NG
G
4
4.
.
H
HÀ
ÀM
M
V
VÀ
À
T
TR
RU
UY
Y
N
N
T
TH
HA
AM
M
S
S
4.1. Định nghĩa hàm trong C
4.1.1. Khai báo hàm
Hàm mt khi lệnh đưc thc hiện khi đưc gi t một điểm khác ca
chương trình.
pháp:
type <tên hàm> ([tham s 1], [tham s 2], ...)
<khi lnh>;
Trong đó:
- type là kiu d liệu đưc tr v ca hàm.
- <tên hàm> là tên gi ca hàm.
- [tham s i] là các tham s (có nhiều bao nhiêu cũng được tu theo nhu cu).
Mt tham s bao gm tên kiu d liệu sau đó tên ca tham s giống như khi
khai báo biến (ví d int x) đóng vai trò bên trong hàm như bất biến nào khác.
Chúng dùng để truyn tham s cho hàm khi được gi. Các tham s khác nhau được
ngăn cách bởi các du phy.
- <khi lnh> là thân ca hàm. Nó có th là mt lệnh đơn hay một khi lnh.
Ví d 4.1: ới đây là ví dụ đầu tiên v hàm
#include <stdio.h>
int addition(int a, int b)
{
int r;
r = a+b;
return (r);
}
int main()
{
58
int z;
z = addition(5, 3);
printf("\n Z = %d", z);
}
Kết qu: z = 8
Chúng ta th thy hàm main bắt đu bng vic khai báo biến z kiu int. Ngay
sau đó một li gi ti hàm addition. Nếu để ý chúng ta s thy s tương tự gia cu
trúc ca li gi hàm vi khai báo ca hàm:
Các tham s vai trò tht ràng. Bên trong hàm main chúng ta gi hàm
addition và truyn hai giá tr: 5 và 3 tương ng vi hai tham s int a int b được khai
báo cho hàm addition.
Vào thời điểm hàm đưc gi t main, quyền điều khiển được chuyn sang cho
hàm addition. Giá tr ca c hai tham s (5 3) được copy sang hai biến cc b int a
int b bên trong hàm.
Dòng lnh sau:
return (r);
Kết thúc hàm addition, tr li quyền điều khiển cho hàm o đã gi (main)
và tiếp tục chương trình ở cái đim mà nó b ngt bi li gi đến addition. Nhưng thêm
vào đó, giá tr được dùng vi lnh return (r) chính là giá tr được tr v ca hàm.
Giá tr tr v bi mt hàm chính giá tr của hàm khi được tính toán. vy
biến z s có có giá tr đưc tr v bi addition(5, 3), đó là 8.
59
4.1.2. Phm vi hot đng ca các biến
Bn cn nh rng phm vi hoạt động ca c biến khai báo trong mt hàm hay
bt mt khi lnh nào khác ch m đó hay khối lệnh đó không thể s dng
bên ngoài chúng. Trong chương trình d trên, bn không th s dng trc tiếp các
biến a, b hay r trong hàm main chúng các biến cc b ca m addition. Thêm
vào đó bạn cũng không thể s dng biến z trc tiếp bên trong m addition làm
biến cc b ca hàm main.
Tuy nhiên bn có th khai báo các biến toàn cục đểth s dng chúng bt
đâu, bên trong hay bên ngoài bất hàm nào. Để làm vic y bn cn khai báo chúng
bên ngoài mi hàm hay các khi lnh, có nghĩa là ngay trong thân chương trình.
Ví d 4.2: Đây là một ví d khác vm:
#include <stdio.h>
int subtraction(int a, int b)
{
int r;
r = a-b;
return (r);
}
int main()
{
int x = 5, y = 3, z;
z = subtraction(7, 2);
printf("\nKet qua 1: %d", z);
printf("\nKet qua 2: %d", subtraction(7, 2));
printf("\nKet qua 3: %d", subtraction(x, y));
z = 4 + subtraction(x, y);
printf("\nKet qua 4: %d", z);
}
Kết qu:
60
Ket qua 1: 5
Ket qua 2: 5
Ket qua 3: 2
Ket qua 4: 6
Trong trưng hp y chúng ta to ra m subtraction. Chức năng ca m y
là ly hiu ca hai tham s ri tr v kết qu.
Tuy nhiên, nếu phân tích hàm main các bn s thấy chương trình đã vài lần gi
đến hàm subtraction. Tôi đã s dng vài cách gọi khác nhau để c bn thy các cách
khác nhau mà mt hàm có th được gi.
Để hiu cn k d y bn cn nh rng mt li gọi đến mt m th
hoàn toàn được thay thế bi giá tr ca nó. Ví d trong lnh gọi hàm đầu tiên:
z = subtraction(7, 2);
printf("Ket qua 1: %d", z);
Nếu chúng ta thay li gi hàm bng giá tr của nó (đó là 5), chúng ta s :
z = 5;
printf("Ket qua 1: %d", z);
Tương tự như vậy
printf("Ket qua 2: %d", subtraction(7, 2));
Cũng cho kết qu giống như hai dòng lệnh trên nhưng trong trường hp y
chúng ta gi hàm subtraction trc tiếp như là một tham s ca printf. Chúng ta cũng
th viết:
printf("Ket qua 2: %d", 5);
Vì 5 là kết qu ca subtraction(7, 2). Còn vi lnh
printf("Ket qua 3: %d", subtraction(x, y));
61
Điu mi m duy nht đây các tham số ca subtraction c biến thay
các hằng. Điều y hoàn toàn hp lệ. Trong trưng hp y giá tr được truyn cho
hàm subtraction là giá tr ca x and y.
Trưng hp th tư cũng hoàn toàn tương tự. Thay vì viết
z = 4 + subtraction(x, y);
chúng ta có th viết:
z = subtraction(x, y) + 4;
Cũng hoàn toàn cho kết qu tương đương.
4.2. Truyền tham số cho hàm
Cho đến nay, trong tt c các m chúng ta đã biết, tt c các tham s truyn cho
hàm đều được truyn theo giá trị. Điều này có nghĩa khi chúng ta gi hàm vi c
tham s, nhng chúng ta truyn cho m các giá tr ch không phi bn thân các
biến. Ví d, gi s chúng ta gọi hàm addition như sau:
int x = 5, y = 3, z;
z = addition(x, y);
Trong trường hp y khi chúng ta gi hàm addition thì các giá tr 5 and 3 được
truyn cho hàm, không phi là bn thân các biến.
Đến đây các bạn có th hỏi tôi: Như vậy thì sao, ảnh hưởng gì đâu? Điều đáng
nói đây là khi các bạn thay đổi giá tr ca các biến a hay b bên trong hàm thì các biến
x y vẫn không thay đổi chúng đâu được truyn cho hàm ch giá tr ca
chúng đưc truyn mà thôi.
Hãy xét trường hp bn cn thao tác vi mt biến ngoài bên trong mt hàm. Vì
vy bn s phi truyn tham s dưới dng tham s biến như trong m duplicate
trong ví d dưới đây:
Ví dụ 4.3: