Professional Documents
Culture Documents
type *pointer_name;
void *<tên_con_trỏ>;
Ví dụ
int *number;
char *character;
float *greatnumber;
• Đây là ba khai báo của con trỏ
• Mỗi biến trỏ tới một kiểu dữ liệu khác nhau
• Chúng đều chiếm một lượng bộ nhớ như nhau
(kích thước của một biến con trỏ tùy thuộc vào hệ điều
hành)
• Dữ liệu mà chúng trỏ tới không chiếm lượng bộ nhớ
như nhau, một kiểu int, một kiểu char và cái còn lại
kiểu float
Con trỏ – Khai báo trong C
int *pi;
float *pf;
*<tên_con_trỏ>;
#include <stdio.h> p c
char g = 'z'; 0x1132 'a'
int main() a 0x1132
{ z
char c = 'a'; p g
char *p; 0x91A2 'z'
p = &c; 0x91A2
printf("%c\n", *p); xuất giá trị do p đang
p = &g; quản lý
printf("%c\n", *p);
return 0;
}
Phân biệt toán tử & và *
• Toán tử lấy địa chỉ (&)
Nó được dùng như là một tiền tố của biến và có thể
được dịch là "địa chỉ của“
&variable1 có thể được đọc là "địa chỉ của variable1“
• Toán tử (*)
Nó chỉ ra rằng cái cần được tính toán là nội dung được
trỏ bởi biểu thức được coi như là một địa chỉ. Được
dịch là "giá trị được trỏ bởi"..
*mypointer được đọc là "giá trị được trỏ bởi mypointer"
Con trỏ - Truyền tham số địa chỉ
#include <stdio.h>
void change(int *v);
int main()
{
int var = 5;
change(&var);
printf("main: var = %i\n", var);
return 0;
}
int main(void) i
{ 0x2100
int i = 10, j = 14,
k; j
int *p = &i; 0x2104
int *q = &j; k
0x1208
*p += 1;
p = &k; p
*p = *q; 0x120B
p = q;
q
*p = *q;
0x1210
return 0;
}
Con trỏ và Mảng
char s[100];
unsigned char s1[1000];
Chuỗi ký tự - Ví dụ
char first_name[5] = { 'J', 'o', 'h', 'n', '\0' };
othe 'T' 'o' ‘n’ 'y' 32 'B' 'l' 'u' 'r' 't' ‘\0’
r
characters 'N' 'o' 32 'n' 'u' 'l' 'l' ‘\0’
Chuỗi ký tự - Nhập / xuất
• Có thể nhập / xuất chuỗi ký tự s bằng cách
nhập từng ký tự của s
• Hoặc sử dụng các hàm scanf và printf
với ký tự định dạng “%s”
char other[] = "Tony Blurt";
printf("%s\n", other);
int main()
{ "Blurt" sẽ không
char other[] = "Tony Blurt"; được in ra
printf("%s\n", other);
other[4] = '\0';
othe 'T' 'o' ‘n’ 'y' 32 'B' 'l' 'u' 'r' 't' 0
r
Chuỗi ký tự – Một số hàm thư viện
• #include<string.h>
• Lấy độ dài chuỗi
l = strlen(s);
• Đổi toàn bộ các ký tự của chuỗi thành IN
HOA
strupr(s);
• Đổi toàn bộ các ký tự của chuỗi thành in
thường
strlwr(s);
Chuỗi ký tự – Một số hàm thư viện
• So sánh chuỗi: so sánh theo thứ tự từ điển
int main()
Minor < Tony
{
char s1[] = "Minor";
char s2[] = "Tony";
int cmp = strcmp(s1, s2);
if (cmp < 0)
printf("%s < %s", s1, s2);
else
if (cmp == 0)
printf("%s = %s", s1, s2);
else
printf("%s > %s", s1, s2);
return 0;
}
Chuỗi ký tự – ví dụ strcmp
Nguyên tắc so sánh
Duyệt lần lượt từng ký tự của 2 chuỗi. So sánh mã ACSII của 2
ký tự đó, mã ký tự nào lớn hơn tức là chuỗi lớn hơn và ngừng so
sánh. Nếu một chuỗi nào hết ký tự để so sanh trước thì chuỗi đó
bé hơn.
Chuỗi ký tự – Một số hàm thư viện
• Gán nội dung chuỗi:
o Chép toàn bộ chuỗi s2 sang chuỗi s1:
strcpy(s1,s2);
o Chép tối đa n ký tự từ s2 sang s1:
strncpy(s1,s2,n);
• Cộng chuỗi: ghép chuỗi s2 vào chuỗi s1
strcat(s1,s2);
• Tạo chuỗi mới từ chuỗi đã có:
strdup(s);
• Tìm kiếm kí tự trong chuỗi:
strchar(s,chr);
• Tìm kiếm chuỗi trong chuỗi:
strstr(s1,s2);
• Đảo ngược trật tự một chuỗi:
strrev(s);
Chuỗi ký tự – ví dụ strcpy
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() Tony Blurt
{ To123Blurt
char s[] = "Tony Blurt"; Blurt
char s2[100], *s3;
strcpy(s2, s);
printf("%s\n", s2);
strncpy(s2 + 2, "12345", 3);
printf("%s\n", s2);
s3 = strdup(s + 5);
printf("%s\n", s3);
free(s3);
return 0;
}
Chuỗi ký tự – ví dụ strcpy
Hàm strcpy(char* s1, char* s2) copy nội dung vùng nhớ s2
vào vùng nhớ s1. Vùng nhớ s1 phải được cấp phát tĩnh hoặc
cấp phát động trước đó (malloc( ),. Kích thước vùng nhớ s1
phải đủ để chứa chuỗi s2. Nếu không đủ vùng nhớ, gây ra
buffer overrun.
int main()
{
char s[]= "Thu tim kiem chuoi";
char *p;
p = strchr(s, 'm');
printf("%s\n", p);
p = strstr(s, "em");
printf("%s\n", p); m kiem chuoi
return 0; em chuoi
}
Tổng kết
• Khai báo
• Nhập / xuất
• Con trỏ và chuỗi ký tự
• Một số hàm thư viện
• Chèn / loại bỏ một đoạn con
Tài liệu tham khảo
• [K&R] Chapter 7