include int tich(int X, int y) { return (xy); } void mainO { int dai, rong, dt; printf(“ Nhap chieu dai:”); scanf(“%d”, dai); printf(“ Nhap chieu rong:”); scanf(“%d”, rong); dt= tich(dai,rong); printf(“ Dien tích: %d”, dt);
Hàm #include <stdio.h> int tich(int X, int y) { return (x*y); } void mainO { int dai, rong, dt; printf(“\n Nhap chieu dai:”); scanf(“%d”, &dai); printf(“\n Nhap chieu rong:”); scanf(“%d”, &rong); dt= tich(dai,rong); printf(“\n Dien tích: %d”, dt); Hàm #include <stdio.h> int tich(int X, int y ) ; II nguyên mẫu hàm (prototype) void mainO { int dai, rong, dt; printf(“\n Nhap chieu dai:”); scanf(“%d”, &dai); printf(“\n Nhap chieu rong:”); scanf(“%d”, &rong); dt= tich(dai,rong);// lời gọi hàm printf(“\n Dien tich: %d”, dt); } int tich(int X, int y)// định nghĩa hàm { return (x*y); } Hoạt động của hàm cấp phát bộ nhớ cho các tham số và các biến cục bộ ■ ■ Gán giá trị của các đối số cho các tham số tương ứng Thực hiện các lệnh trong thân hàm ■ ■ ■ W Khi gặp lệnh return hoặc cuối thân hàm thì giải phóng vùng nhớ vừa cấp phát và thoát khỏi hàm 1. #include <stdio.h> 2. void hoanvi(int a,int b); 3. void main() 4. { int x=2, y=3; 5. printf(“\nTruoc khi goi ham : x = %d , y = %d “,x,y); 6. hoanvi(x,y); 7. printf(“\nSau khi goi ham : x = %d , y = %d “,x,y); 8. } 9. void hoanvi(int a,int b) 10. { int tarn; 11. printf(“\nTruoc khi hoan vi: a = %d , b = %d “,a,b); 12. tam=a; 13. a=b; 14. b=tam; 15. printf(“\nSau khi hoan vi: a = %d , b = %d “,a,b); 16. } Truyền đối số theo giá trị Hàm tạo ra một biến mới cùng kiểu với đối số và sao chép giá trị của đối số vào biến đó. Hàm không truy cập trực tiếp vào biến ban đẩu mà chỉ tác động lên bản sao mà nó tạo ra. Sự thay đổi ở bản sao không tác động đến biến ban đẩu (biến gốc). Hữu dụng khi hàm không có ý định thay đổi giá trị của biến gốc. 1. #include <stdio.h> // truyền địa chỉ cho hàm 2. void hoanvi(int *px,int *py); 3. void mainO 4. { int x=2, y=3; 5. hoanvi(&x,&y); 6. printf(“\nx=%d,y=%d”,x,y); 7. } 8. void hoanvi(int *px,int *py) 9. { int tam; 10. tam=*px; 11. *px=*py; 12. *py=tam; 13. } Phạm vi biến ■ Biến toàn cục: ■ - Được khai báo ở ngoài mọi hàm (kể cả hàm main) - Được sử dụng ở mọi nơi trong chương trình Biến địa phương: - ĐƯỢC khai báo trong hàm hoặc trong khối lệnh - Chỉ được sử dụng trong thời gian gọi hàm đó hoặc trong thời gian thực hiện khối lệnh đó ■ w ■ ■ ■ cấp phát bộ nhớ Biến toàn cục được cấp phát tĩnh Biến địa phương: - cấp phát động: biến được giải phóng khi kết thúc hàm, không lưu kết quả cho lẩn sau - Cấp phát tĩnh: biến không được giải phóng khi kết thúc hàm, lưu kết quả cho lần sau - Mặc định biến địa phương là cấp phát động. Để Cấp phát tĩnh biến địa phương, ta dùng từ khoá static trước khai báo của biến 1. #include <stdio.h> 2. void ham(void); 3. void mainO 4. { int dem; 5. for(dem=0;dem<=3;dem++) 6. { printf(“\nLan goi thu %d”,dem); 7. hamO; 8. } 9. } 10. void ham(void) 11. { static int x; 12. int y=0; 13. printf(“ x = %d , y = %d “,x++,y++); 14. } cấp phát bộ nhớ Biến địa phương (tiếp theo) - Biến địa phương thanh ghi: • khai báo : register int x; • yêu cáu trình biên dịch đặt biến đó vào thanh ghi (nếu có thể) • không dùng từ khóa register với biến tĩnh. • không định nghĩa con trỏ đến biến thanh ghi [...]... ,4 } Con trỏ 1 2 3 4 5 6 7 Khái niệm Con trỏ và biến đơn Con trỏ và mảng một chiều Truyền mảng một chiều cho hàm Con trỏ và xâu ký tự Con trỏ và mảng nhiều chiều Truyền mảng nhiều chiều cho hàm ■ Khái niệm con trỏ ■ Khi khai báo 1 biến, trình biên dịch sẽ c p phát 1 ô nhớ với địa chỉ duy nhất cho biến đó Con trỏ là biến dùng để chứa địa chỉ c a biến kh c Con trỏ ptr chứa địa chỉ c a biến b => con trỏ... printf(“\n”); } } Truyền mảng nhiều chiều cho hàm Giả sử ta c n truyền mảng float a[4] [5] cho hàm C ch 1: khai báo float (*pa)[5]; ho c float pa[][5]; Trong thân hàm, để truy c p phần tửa[i][j] ta dùng pa[i][j] C ch 2: khai báo float *pa; và int n; // số c t Trong thân hàm, để truy c p phần tửa[i][j] ta dùng *(pa+i*n+j) 1 //chương trình nhập xuất mảng 2 chiều theo c ch 1 2 #include 3 void nhap(int... ham(x,y,&tong,&tich); printf("\n x=%d",x); printf("\n y=%d",y); printf("\n tong=%d",tong); printf("\n tich=%d",tich); } Con trỏ và mảng một chiểu C c phần tử c a mảng đư c cấp phát liên tiếp nhau, phần tử đầu tiên c địa chỉ thap nhất Tên mảng là hằng con trỏ, luôn trỏ đến phắn tử đầu tiên c a mảng Số h c con trỏ: phép tăng / giảm con trỏ làm cho con trỏ trỏ đến phần tử liền sau / liền trư c của phần tử... i . động c a hàm c p phát bộ nhớ cho c c tham số và c c biến c c bộ ■ ■ Gán giá trị c a c c đối số cho c c tham số tương ứng Th c hiện c c lệnh trong thân hàm ■ ■ ■ W Khi gặp lệnh return ho c cuối. toàn c c: ■ - Đư c khai báo ở ngoài mọi hàm (kể c hàm main) - Đư c sử dụng ở mọi nơi trong chương trình Biến địa phương: - ĐƯ C khai báo trong hàm ho c trong khối lệnh - Chỉ đư c sử dụng trong. gian gọi hàm đó ho c trong thời gian th c hiện khối lệnh đó ■ w ■ ■ ■ c p phát bộ nhớ Biến toàn c c đư c cấp phát tĩnh Biến địa phương: - c p phát động: biến đư c giải phóng khi kết th c hàm,