− Dùng để lưu địa chỉ bộ nhớ của một đối tượng.[r]
Trang 1Ôn tập kỹ thuật lập trình
GV: Nguyễn Hữu Thể Khoa CNTT – Đại Học Cửu Long
Trang 2NỘI DUNG
Hàm và thủ tục
1
Con trỏ
2
5
Trang 3I Hàm và thủ tục
I.1 Hàm
− Khi định nghĩa hàm, ta luôn khai báo tường minh giá trị trả về khi
hàm thực hiện xong
− Cú pháp:
<kiểu dữ liệu> <tên hàm> (danh sách các tham số)
{
//Thân hàm return <biến> //cùng kiểu dữ liệu với hàm }
Trang 4I.1 Hàm
Ví dụ: tính tổng 2 số nguyên a, b Trả về giá trị là tổng 2 số
Gọi hàm trong main()
int TinhTong(int a, int b)
{
int tong;
tong = a + b;
return tong;
}
int TinhTong(int a, int b) {
return (a+b);
}
void main()
{
int a=4, b=5;
int tmp;
tmp = TinhTong(a,b);
printf(“Tong 2 so:%d”
,tmp);
void main() {
int a=4, b=5;
printf(“Tong 2 so la:
%d”, TinhTong(a,b)); }
Trang 5I.2 Thủ tục (Hàm không có giá trị trả về)
− Thủ tục không trả về giá trị, ta dùng từ khóa void để khai báo kiểu
dữ liệu
− Cú pháp:
void <tên hàm> (danh sách các tham số)
{
//Thân hàm, xử lý các dữ liệu //Nếu cần biết thông tin dl thì in ra màn hình }
Trang 6I.2 Thủ tục
Ví dụ: tính tổng 2 số nguyên a, b In kết quả ra màn hình
Gọi hàm trong main()
void TinhTong(int a, int b)
{
int tong;
tong = a + b;
printf(“%d”,tong);
}
void TinhTong(int a, int b) {
printf(“%d”,(a+b)); }
void main()
{
int a=4, b=5;
TinhTong(a,b);
}
void main() {
TinhTong(4,5));
}
Trang 7Cách tổ chức mã nguồn trong C
Cách 1: khai báo prototype Cách 2: để hàm main sau cùng
#include<stdio.h>
#include<conio.h>
//khai báo prototype
void TinhTong(int a, int b);
void main()
{
int a=4, b=5;
TinhTong(a,b);
getch();
}
void TinhTong(int a, int b)
{
int tong;
tong = a + b;
printf(“%d”,tong);
#include<stdio.h>
#include<conio.h>
void TinhTong(int a, int b) {
int tong;
tong = a + b;
printf(“%d”,tong); }
void main() {
int a=4, b=5;
TinhTong(a,b);
getch();
}
Trang 8II Con trỏ
II.1 Truy cập địa chỉ
− Trong các ngôn ngữ lập trình, khi một biến được khai báo, ba thuộc
tính cơ bản sau được liên kết đến nó:
Tên định danh của biến
Kiểu dữ liệu liên quan
Địa chỉ trong bộ nhớ
Ví dụ: khai báo biến
int n = 10;
n là tên định danh của biến, có kiểu int và được lưu trữ đâu đó trong bộ nhớ máy tính.
Xuất:
printf(“%d”,n); //in nội dung biến
…
…
…
10
Địa chỉ: FFF0
Nội dung ô nhớ
Trang 9II.1 Truy cập địa chỉ
Ví dụ:
void main()
{
int n=10;
printf(“%d”,n); //in nội dung biến printf(“%0X”,&n);//in địa chỉ của biến }
Kết quả thực hiện như sau:
• Ta thấy giá trị của n là 10
• Địa chỉ biến n theo số hexa là FFF0
10 FFF0
Trang 10II.2 Biến tham chiếu
− Dùng một biến khác truy cập đến cùng một địa chỉ với biến đã có, ta
sử dụng biến tham chiếu (references)
− Cú pháp:
type& alias = name
type: kiểu dữ liệu
alias: tên biến tham chiếu
name: tên của biến mà biến alias tham chiếu đến
void main()
{
int n=10;
int& r=n;
printf(“n=%d, r=%d”,n,r);
n++;
printf(“n=%d, r=%d”,n,r);
Kết quả
n = 10, r = 10 n= 11, r = 11
Trang 11II.3 Biến con trỏ
− Dùng để lưu địa chỉ bộ nhớ của một đối tượng
− Cú pháp:
type* var
type: kiểu dữ liệu
var: biến con trỏ
Ví dụ:
int x=10;
int* p;
p=&x; //p lưu địa chỉ của x, hay p trỏ đến x
Ghi chú:
(*p): nội dung của p
toán tử (*): toán tử đọc nội dung gián tiếp thông qua con trỏ
Trang 12II.3 Biến con trỏ
Ví dụ:
void main()
{
int x=10;
int* p=&x; //p tr? d?n x printf("Dia chi cua x: %0X \n",&x);
printf("Noi dung cua x: %d \n",x);
printf("Dia chi cua p: %0X \n",&p);
printf("Noi dung cua p: %0X",p);
printf("Noi dung tai dia chi ma p tro den: %d",*p); }
FFEE
FFF0
(&x)
Địa chỉ
FFF0 p
10
(x)
x
Nội dung (giá trị) Biến
Trang 13Ví dụ
void HoanVi_1(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
void HoanVi_2(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void HoanVi_3(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
void main() {
int a = 1, b = 2;
HoanVi_1(a, b);
printf("a = %d",a); printf("b = %d",b); }
void main() {
int *a = 1, *b = 2; HoanVi_2(a, b);
printf("a = %d",*a); printf("b = %d",*b); }
void main() {
int a = 1, b = 2;
HoanVi_3(a, b);
printf("a = %d", a); printf("b = %d", b);
Trang 14II.4 Con trỏ và mảng
− Con trỏ và mảng 1 chiều
int a[] = {4,5,7,9};
Truy xuất phần tử thứ hai a[1]=5
Sử dụng con trỏ:
• Tên mảng xem như con trỏ
• Truy xuất phần tử thứ i: a[i] hay *(a+i)
− Con trỏ và mảng 2 chiều
int a[2][3]={{4,5,7},
{9,10,12}};
Truy xuất phần tử thứ i=1,j=1 là: a[1][1]=10
Sử dụng con trỏ:
• Tên mảng xem như con trỏ
• Truy xuất phần tử thứ i,j: a[i][j] hay *(*(a+i)+j)
Trang 15Bài tập
1 Cho mảng 1 chiều int a[] = {4,5,7,9}
Viết thủ tục xuất giá trị mảng ra màn hình (sử dụng con trỏ truy xuất mảng)
2 Cho mảng 2 chiều int a[2][3]={{4,5,7},{9,10,12}};
Viết thủ tục xuất giá trị mảng ra màn hình (sử dụng con trỏ truy xuất mảng)