Hoạt động của hàmcấ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
Trang 1{ 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);
Trang 2#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);
}
Trang 3Hoạ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
Trang 5Truyề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
Trang 61 #include <stdio.h> // truyền địa chỉ cho hàm
2 void hoanvi(int *px,int *py);
Trang 7Phạ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 ■ ■ ■
Trang 8cấ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
Trang 10cấ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
Trang 12printf("\nUSCLN=%d",uscln(x,y));
}
Trang 14Mảng Một số lượng hữu hạn các phần tử cùng
Khai báo mảng: int a[3];
Khai báo và khởi tạo mảng: int a[3]={l,3,2} ; Khai báo xâu ký tự:
- char text[5]={‘a ,’b’,’c’,’d’,’\0’ };
- char text[5]=“abcd”;
Trang 155 for(i=0 ; i<n ; i++)
6 { printf( \nx[ó/od]=”, i);
7 scanf(“%d”, &mang[i]);
9 printf(“\n Mang gom cac phan tu :\n”);
10 for(i=0 ; i<n ; i++)
11 pri ntf(“\nx[%d]=%d”, i, mang [i]);
12 }
Trang 16Mảng nhiều chiểu
Khai báo và khởi tạo mảng nhiều chiều
in tx[2 ][3 ]= { {1 ,2 ,3 },
{2 ,3 ,4 }
Trang 176 Con trỏ và mảng nhiều chiều
7 Truyền mảng nhiều chiều cho hàm
Trang 18Khá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ỏ ptr đang trỏ đến biến b
Trang 19Con trỏ và biến đơn
Khai báo con trỏ: int b, *ptr;
Khởi tạo con trỏ: ptr = &b;
Trang 21Vi du kiem dinh gia tri con tro■ ■ ■
printf(“\nGia tri cua number: %d”,number);
printf(“\nDia chi cua number: %p”,&number);
printf(“\nGia tri cua con tro pointer: %p”,pointer);
printf(“\nGia tri duoc tro toi boi pointer: %d”,*pointer);printf(“\nDia chi cua con tro pointer: %p”,&pointer);
getchO;
}
Trang 231 #include <stdio.h> // hàm có nhiều giá trị đẩu ra
2 void ham(int X, int y, int *sum, int *product)
Trang 24Con 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ử ban đầu
Trang 26Truyền mảng một chiều cho hàm
int max( int x[ ], int n)
Trang 27void nhap( int xQ)
void xuat(const int xO) // chú ý từ khoá const
Trang 28Con trỏ và mảng nhiều chiều
Trang 29• Các phẩn tử của mảng 2 chiều được sắp xếp: các phần tử của hàng đầu tiên, saũ đó đến các phần tử của hàng kế tiếp .
int*pa, a[4][6];
pa=(int *)a; // ép kiểu
Khi đó pa là địa chỉ của a[0][0]
pa + 1 là địa chỉ của a[0][l]
pa + 2 là địa chỉ của a[0][2]
Con trỏ và mảng nhiều chiều
pa + ¡*6 + j là địa chỉ của
Trang 306 printf(“\nNhap vao cac phan tu cua mang:”);
7 for (i=0 ; i<4 ; i++)
Trang 31Truyề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àmCá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)
Trang 321 //chương trình nhập xuất mảng 2 chiều theo cách 1
2 #include <stdio.h>
3 void nhap(int a|][6],int m,int n)
4 { int i,j, x; // X là biến trung gian
6 printf("\nNhap vao cac phan tu cua mang:");
7 for ( i=0 ; i<m ; i++)
Trang 3315 void hienthi(int a0[6],int mjnt n)
16 { int i,j;
17 printf("\nCac phan tu cua mang:\n");
18 for ( i=0 ; i<m ; i++)
Trang 341 // nhập xuất mảng 2 chiều theo cách 2
Trang 3516 void hienthi(int *p, int m, int n)
17 { int i, j;
18 printf("\nCac phan tu cua mang:\n");
19 for ( i=0 ; i<m ; i++)
27 int *pa, a[10][N];
28 pa=(int *)a; // chú ý lệnh này