Các toán tử con trỏ:-indirection/dereferencing operator : Trả về toán hạng của con trở trỏ đến: *yptr returns y bởi vì yptr trỏ tới y CON TRỎ *yptr returns y bởi vì yptr trỏ tới y Co
Trang 1LẬP TRÌNH CƠ BẢN
CON TRỎ VÀ XÂU KÝ TỰ
LẬP TRÌNH CƠ BẢN
Trang 2Con trỏ
Xâu ký tự
NỘI DUNG
Trang 3Giới thiệu:
Các biến chúng ta đã biết và sử dụng trước
đây đều là biến có kích thước và kiểu dữ liệu
xác định Người ta gọi các biến kiểu này là
Trang 4Giới thiệu:
Biến con trỏ (pointer) với các đặc điểm:
Biến con trỏ không chứa dữ liệu mà chỉ chứa địa chỉ của dữ liệu hay chứa địa chỉ của ô nhớ chứa
Trang 5Biến con trỏ:
Các giá trị của chúng chứa địa chỉ các ô nhớ
Các biến thông thường chứa giá trị cụ thể (tham
chiếu trực tiếp)
CON TRỎ
count
7
Con trỏ chứa địa chỉ của các biến có giá trị cụ thể
(tham chiếu không trực tiếp)
Tham chiếu không trực tiếp là con trỏ giá trị
7
count countPtr
Trang 6Khai báo con trỏ:
<Kiểu> * <Tên con trỏ> ;
* được sử dụng với các biến con trỏ:
int *myPtr;
Khai báo một con trỏ trỏ tới kiểu int (con trỏ của kiểu int *)
CON TRỎ
Khai báo một con trỏ trỏ tới kiểu int (con trỏ của kiểu int *)
Các con trỏ yêu cầu sử dụng dấu * trước mỗi khai
báo biến:
int *myPtr1, *myPtr2;
Trang 7Các toán tử con trỏ:
& (Toán tử địa chỉ - address operator):
Trả về địa chỉ của toán hạng
yptr
500000 600000
y
600000 5
Trang 8Các toán tử con trỏ:
-indirection/dereferencing operator ):
Trả về toán hạng của con trở trỏ đến:
*yptr returns y (bởi vì yptr trỏ tới y)
CON TRỎ
*yptr returns y (bởi vì yptr trỏ tới y)
Con trỏ không tham chiếu (toán hạng của *) phải là một giá trị (không là hằng)
* và & là hai toán tử ngược nhau
Trang 9Các toán tử con trỏ:
CON TRỎ
Trang 10Các toán tử con trỏ:
CON TRỎ
Trang 11Gọi hàm tham chiếu với đối số con trỏ:
Truyền địa chỉ của đối số sử dụng toán tử &
Cho phép ta thay đổi thực sự trên ô nhớ
Mảng không truyền với & bởi vì tên mảng đã là một
con trỏ
CON TRỎ
con trỏ
Toán tử * được sử dụng như biến trong thân hàm:
void double( int *number ) {
*number = 2 * ( *number );
}
Trang 12const pointers
Trỏ đến một ô nhớ cố định
Phải khởi tạo khi khai báo
int *const myPtr = &x;
Kiểu int *const – Hằng con trỏ kiểu int
CON TRỎ
Kiểu int *const – Hằng con trỏ kiểu int
const pointer to a const int
x có thể thay đổi, nhưng không thể thay đổi *Ptr
Trang 14Biểu thức con trỏ và các phép toán số học
Các phép số học có thể thực hiện trên con trỏ:
Increment/decrement pointer (++ or )
Cộng số nguyên với pointer( + or += , - or -=)
Các con trỏ có thể trừ cho nhau
CON TRỎ
Các con trỏ có thể trừ cho nhau
Các toán tử trên vô nghĩa trừ khi thực hiện
trên mảng.
Trang 15Biểu thức con trỏ và các phép toán số học
Ví dụ 5 phần tử trong mảng int mỗi phần tử chiếm 4
v[0] v[1] v[2] v[3] v[4]
3000 3004 3008 3012 3016 location
Trang 16Biểu thức con trỏ và các phép toán số học
Ví dụ 5 phần tử trong mảng int mỗi phần tử chiếm 4
Các con trỏ cùng kiểu có thể gán cho nhau
Con trỏ không cùng kiểu thì phải ép kiểu
Trang 19Con trỏ và mảng
Truy cập các phần tử mảng nhiều chiều theo
dạng con trỏ theo các quy tắc sau:
Trang 20Con trỏ và mảng
Truy cập các phần tử mảng nhiều chiều theo
dạng con trỏ theo các quy tắc sau:
Trang 27Khai báo:
char <Biến> [n]; // Khai báo với chiều dài tối đa
n là chiều dài tối đa, bộ nhớ sẽ cung cấp n+1 byte, trong đó byte cuối cùng lưu k tự ‘\0’ để đánh dấu kết thúc chuỗi
char <Biến>[] = “<Khởi tạo>";
XÂU KÝ TỰ
char <Biến>[] = “<Khởi tạo>";
char *<BienPtr> = “<Khởi tạo>";
Ví dụ:
char color[] = "blue";
char *colorPtr = "blue";
Color có 5 phần tử
Trang 28Nhập/xuất chuỗi:
Để nhập một chuỗi ký tự từ bàn phím, ta sử dụng hàm gets() Cú pháp:
gets(<Biến chuỗi>)
XÂU KÝ TỰ
gets(<Biến chuỗi>)
Ta cũng có thể sử dụng hàm scanf() để nhập dữliệu cho biến chuỗi, tuy nhiên lúc này ta chỉ có thểnhập được một chuỗi không có dấu khoảng trắng
Trang 29Nhập/xuất chuỗi:
Xuất chuỗi lên màn hình
Để xuất một chuỗi (biểu thức chuỗi) lên màn hình,
Trang 30Các hàm xử lý chuỗi:
Cộng chuỗi - Hàm strcat():
char *strcat(char *des, const char *source)
Hàm này có tác dụng ghép chuỗi nguồn vào chuỗi đích
XÂU KÝ TỰ
đích
Xác định độ dài chuỗi - Hàm strlen()
Cú pháp: int strlen(const char* s)
Trang 31Sao chép chuỗi, hàm strcpy(): Hàm này được dùng
để sao chép toàn bộ nội dung của chuỗi nguồn vào
chuỗi đích Cú pháp:
Trang 32Các hàm xử lý chuỗi:
Hàm này cho phép chép n ký tự đầu tiên của chuỗi nguồn sang chuỗi đích Cú pháp:
char *strncpy(char *Des, const char *Source,
XÂU KÝ TỰ
char *strncpy(char *Des, const char *Source,
size_t n)
Trích một phần chuỗi, hàm strchr()
Trang 33Các hàm xử lý chuỗi:
Tìm kiếm nội dung chuỗi, hàm strstr()
Hàm strstr() được sử dụng để tìm kiếm sự xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1 Cú pháp:
Trang 34Các hàm xử lý chuỗi:
So sánh chuỗi, hàm stricmp()
Hàm này thực hiện việc so sánh 2 chuỗi s1 và s2, không phân biệt chữ thường và chữ hoa Cú pháp: int stricmp(const char *s1, const char *s2)
XÂU KÝ TỰ
int stricmp(const char *s1, const char *s2)
Khởi tạo chuỗi, hàm memset()
Hàm này được sử dụng để đặt n ký tự đầu tiên của chuỗi là ký tự c Cú pháp:
Trang 35Các hàm xử lý chuỗi:
Đổi từ chuỗi ra số, hàm atoi(), atof(), atol()
(trong stdlib.h) Cú pháp :
int atoi(const char *s) : chuyển chuỗi thành số nguyên
long atol(const char *s) : chuyển chuỗi thành số nguyên
XÂU KÝ TỰ
long atol(const char *s) : chuyển chuỗi thành số nguyên
dài
float atof(const char *s) : chuyển chuỗi thành số thực
Nếu chuyển đổi không thành công, kết quả trả về của các hàm là 0
Trang 36Ví dụ: Viết chương trình cho phép chép toàn bộ chuỗi nguồn
Trang 37Bài 1 Viết chương trình nhập vào một dãy n số nguyên,
sắp xếp dãy số theo thứ tự giảm dần In dãy số sau khi
lên màn hình Nhập một số nguyên khác vào và xét xem
có phần tử nào của ma trận trùng với số này không ? Ở vị
trí nào ? Có bao nhiêu phần tử ? (Dùng con trỏ)
Bài 3: Viết chương trình nhập vào hai ma trận A có cấp
m, k và B có cấp k, n In hai ma trận lên màn h.nh Tích
hai ma trận A và B là ma trận C được tính bởi công thức:
Trang 38Bài 4 Viết chương trình nhập một chuỗi ký tự từ bàn
phím, xuất ra màn h.nh m ASCII của từng ký tự có trong
chuỗi
Bài 5 Viết chương trình nhập một chuỗi ký tự và kiểm tra
xem chuổi đó có đối xứng không
Bài 6 Giả sử Họ tên người Việt luôn có dạng “Họ Đệm
BÀI TẬP THỰC HÀNH
Bài 6 Giả sử Họ tên người Việt luôn có dạng “Họ Đệm
Tên”, trong đó các phần Họ,Đệm, Tên luôn cách nhau 1
dấu cách (Mã ASCII=32); phần Đệm có thể có hoặc
không hoặc có nhiều hơn 1 từ Hãy viết chương trình cho