Bài giảng Nhập môn lập trình: Con trỏ, chuỗi - Trần Phước Tuấn
Con trỏ – Pointer
Khai báo
Các toán từ
Nhắc lại về truyền tham số địa chỉ
Con trỏ và mảng
Cấp phát vùng nhớ động
Nội dung tài liệu Bài giảng Nhập môn lập trình: Con trỏ, chuỗi - Trần Phước Tuấn, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
NMLT
CON TR?, CHU?I
Tr?n Ph??c Tu?n
[email protected]
NH?P MÔN L?P TRÌNH 212/23/2009
Con tr? – Pointer
? Khai báo
? Các toán t? “&”, “*”, “=”, “+”
? Nh?c l?i v? truy?n tham s? ??a ch?
? Con tr? và m?ng
? C?p phát vùng nh? ??ng
NH?P MÔN L?P TRÌNH 312/23/2009
Con tr? – M?t s? lý do nên s? d?ng
? Con tr? là ki?u d? li?u l?u tr? ??a ch? c?a các vùng
d? li?u trong b? nh? máy tính
? Ki?u con tr? cho phép:
? Truy?n tham s? ki?u ??a ch?
? Bi?u di?n các ki?u, c?u trúc d? li?u ??ng
? ??u tr? d? li?u trong vùng nh? heap
? Con tr? ?ã ???c s? d?ng trong hàm scanf
NH?P MÔN L?P TRÌNH 412/23/2009
Con tr? – Khai báo trong C
Ki?u con tr? ph?i ???c ??nh ngh?a trên m?t ki?u c? s? ?ã
???c ??nh ngh?a tr??c ?ó.
typedef ki?uc?s? *Tênki?u;
typedef int *PINT;
//PINT là ki?u con tr? - ??a ch? vùng nh? ki?u int
int x;
PINT p; //p, p1: bi?n ki?u int *
int *p1;
NH?P MÔN L?P TRÌNH 512/23/2009
int *pi;
long int *p;
float* pf;
char c, d, *pc; /* c và d ki?u char
pc là con tr? ??n char */
double* pd, e, f; /* pd là con tr? ??n double
e and f are double */
char *start, *end;
int *pi;
long int *p;
float* pf;
char c, d, *pc; /* c và d ki?u char
pc là con tr? ??n char */
double* pd, e, f; /* pd là con tr? ??n double
e and f are double */
char *start, *end;
Con tr? – Khai báo trong C
NH?P MÔN L?P TRÌNH 612/23/2009
0x91A2
0x1132
Con tr? - Toán t? “&”
? “&”: toán t? l?y ??a ch? c?a 1 bi?n
? ??a ch? c?a t?t c? các bi?n trong ch??ng trình ??u ?ã
???c ch? ??nh t? khi khai báo
char g = 'z';
int main()
{
char c = 'a';
char *p;
p = &c;
p = &g;
return 0;
}
char g = 'z';
int main()
{
char c = 'a';
char *p;
p = &c;
p = &g;
return 0;
}
p c
'a'
0x1132
p g
'z'
0x91A2
NH?P MÔN L?P TRÌNH 712/23/2009
? “*”: toán t? truy xu?t giá tr? c?a vùng nh? ???c qu?n lý
b?i con tr?.
#include
char g = 'z';
int main()
{
char c = 'a';
char *p;
p = &c;
printf("%c\n", *p);
p = &g;
printf("%c\n", *p);
return 0;
}
#include
char g = 'z';
int main()
{
char c = 'a';
char *p;
p = &c;
printf("%c\n", *p);
p = &g;
printf("%c\n", *p);
return 0;
}
a
z
a
z
xu?t giá tr? do p ?ang
qu?n lý
Con tr? - Toán t? “*”
0x91A2
0x1132
p c
'a'
0x1132
p g
'z'
0x91A2
NH?P MÔN L?P TRÌNH 812/23/2009
Con tr? - Truy?n tham s? ??a ch?
#include
void change(int *v);
int main()
{
int var = 5;
change(&var);
printf("main: var = %i\n", var);
return 0;
}
void change(int *v)
{
(*v) *= 100;
printf("change: *v = %i\n", (*v));
}
#include
void change(int *v);
int main()
{
int var = 5;
change(&var);
printf("main: var = %i\n", var);
return 0;
}
void change(int *v)
{
(*v) *= 100;
printf("change: *v = %i\n", (*v));
}
NH?P MÔN L?P TRÌNH 912/23/2009
Con tr? NULL
? Giá tr? ??c bi?t ?? ch? r?ng con tr? không qu?n lý vùng
nào. Giá tr? này th??ng ???c dùng ?? ch? m?t con tr?
không h?p l?.
#include
int main()
{
int i = 13;
short *p = NULL;
if (p == NULL)
printf(“Con tr? không h?p l?!\n");
else
printf(“Giá tr? : %hi\n", *p);
return 0;
}
#include
int main()
{
int i = 13;
short *p = NULL;
if (p == NULL)
printf(“Con tr? không h?p l?!\n");
else
printf(“Giá tr? : %hi\n", *p);
return 0;
}
NH?P MÔN L?P TRÌNH 1012/23/2009
0x15A0
0x15A4
0x15A0
Con tr? - Toán t? gán “=”
? Có s? khác bi?t r?t quan tr?ng khi th?c hi?n các phép gán:
int i = 10, j = 14;
int* p = &i;
int *q = &j;
*p = *q;
int i = 10, j = 14;
int* p = &i;
int *q = &j;
*p = *q;
int i = 10, j = 14;
int *p = &i;
int *q = &j;
p = q;
int i = 10, j = 14;
int *p = &i;
int *q = &j;
p = q;
và:
p i
10
0x15A0
14
q j
0x15A4
14
p i
10
0x15A0
q j
0x15A4
0x15A4
14
0x15A4
NH?P MÔN L?P TRÌNH 1112/23/2009
Luy?n t?p – ?i?n vào ô tr?ng
int main(void)
{
int i = 10, j = 14, k;
int *p = &i;
int *q = &j;
*p += 1;
p = &k;
*p = *q;
p = q;
*p = *q;
return 0;
}
int main(void)
{
int i = 10, j = 14, k;
int *p = &i;
int *q = &j;
*p += 1;
p = &k;
*p = *q;
p = q;
*p = *q;
return 0;
}
i
0x2100
j
0x2104
k
0x1208
p
0x120B
q
0x1210
NH?P MÔN L?P TRÌNH 1212/23/2009
Con tr? và M?ng
? Bi?n ki?u m?ng là ??a ch? t?nh c?a m?t vùng nh?, ???c xác
??nh khi khai báo, không thay ??i trong su?t chu k? s?ng.
? Bi?n con tr? là ??a ch? ??ng c?a m?t vùng nh?, ???c xác
??nh qua phép gán ??a ch? khi ch??ng trình th?c thi.
#include
int main()
{
int a[10] = {1, 3, 4, 2, 0};
int *p;
p = a; //a = p: sai
printf(“0x%04X %i 0x%04X %i\n“, );
a, a[0], p, *p);
return 0;
}
#include
int main()
{
int a[10] = {1, 3, 4, 2, 0};
int *p;
p = a; //a = p: sai
printf(“0x%04X %i 0x%04X %i\n“, );
a, a[0], p, *p);
return 0;
}
NH?P MÔN L?P TRÌNH 1312/23/2009
34
0x15A02
Con tr? - Toán t? “+” v?i s? nguyên
#include
int main()
{
short a[10] = {1, 3, 5, 2, 0};
short *p = a;
printf(“0x%04X %i 0x%04X %i\n“, );
a, a[0], p, *p);
p ++;
printf(“0x%04X %i 0x%04X %i\n“, );
a, a[0], p, *p);
(*p) ++;
printf(“0x%04X %i 0x%04X %i\n“, );
a, a[0], p, *p);
return 0;
}
#include
int main()
{
short a[10] = {1, 3, 5, 2, 0};
short *p = a;
printf(“0x%04X %i 0x%04X %i\n“, );
a, a[0], p, *p);
p ++;
printf(“0x%04X %i 0x%04X %i\n“, );
a, a[0], p, *p);
(*p) ++;
printf(“0x%04X %i 0x%04X %i\n“, );
a, a[0], p, *p);
return 0;
}
1
5
2
0
a
0x15A0
p
0x16B2
NH?P MÔN L?P TRÌNH 1412/23/2009
Con tr? - Luy?n t?p
#include
int main()
{
int a[10] = {2, 3, 5, 1, 4, 7, 0};
int *p = a;
printf(“%i %i\n“, a[0], *p);
p ++;
printf(“%i %i\n“, *p, p[2]);
p ++; a[2] = 9;
printf(“%i %i\n“, p[1], *p);
p -= 2;
printf(“%i %i\n”, p[3], p[1]);
return 0;
}
#include
int main()
{
int a[10] = {2, 3, 5, 1, 4, 7, 0};
int *p = a;
printf(“%i %i\n“, a[0], *p);
p ++;
printf(“%i %i\n“, *p, p[2]);
p ++; a[2] = 9;
printf(“%i %i\n“, p[1], *p);
p -= 2;
printf(“%i %i\n”, p[3], p[1]);
return 0;
}
2 2
3 1
1 9
1 3
2 2
3 1
1 9
1 3
NH?P MÔN L?P TRÌNH 1512/23/2009
Con tr? - C?p phát vùng nh? ??ng
#include
int main()
{
int *p = new int[10];
p[0] = 1;
p[3] = -7;
delete []p;
return 0;
}
#include
int main()
{
int *p = new int[10];
p[0] = 1;
p[3] = -7;
delete []p;
return 0;
}
? Có th? ch? ??nh vùng m?i cho 1 con tr? qu?n lý b?ng các
l?nh hàm malloc, calloc ho?c toán t? new c?a C++
? Vùng nh? do l?p trình viên ch? ??nh ph?i ???c gi?i phóng
b?ng l?nh free (malloc, calloc) ho?c toán t? delete (new)
NH?P MÔN L?P TRÌNH 1612/23/2009
Tóm l??c
? Khai báo
? Các toán t? “&”, “*”, “=”, “+”
? Nh?c l?i v? truy?n tham s? ??a ch?
? Con tr? và m?ng
? C?p phát vùng nh? ??ng
Chu?i ký t? - String
NH?P MÔN L?P TRÌNH 1812/23/2009
Chu?i ký t? – Strings
? M?t s? qui t?c
? Nh?p / xu?t
? Con tr? và chu?i ký t?
? M?t s? hàm th? vi?n
NH?P MÔN L?P TRÌNH 1912/23/2009
Chu?i ký t? - M?t s? qui t?c
? Chu?i ký t? là m?ng m?t chi?u có m?i thành ph?n là m?t
s? nguyên ???c k?t thúc b?i s? 0.
? Ký t? k?t thúc (0) ? cu?i chu?i ký t? th??ng ???c g?i là
ký t? null (không gi?ng con tr? NULL). Có th? ghi là 0
ho?c ‘\0’ (không ph?i ch? o).
? ???c khai báo và truy?n tham s? nh? m?ng m?t chi?u.
char s[100];
unsigned char s1[1000];
char s[100];
unsigned char s1[1000];
NH?P MÔN L?P TRÌNH 2012/23/2009
char first_name[5] = { 'J', 'o', 'h', 'n', '\0' };
char last_name[6] = "Minor";
char other[] = "Tony Blurt";
char characters[7] = "No null";
char first_name[5] = { 'J', 'o', 'h', 'n', '\0' };
char last_name[6] = "Minor";
char other[] = "Tony Blurt";
char characters[7] = "No null";
first_name
last_name
other
characters
Chu?i ký t? - Ví d?
0'n''h''o''J'
0'r''o''n''i''M'
32 'B' 'l' 'u' 'r' 0't''y'‘n’'o''T'
'l' 'l' 0'u''n'32'o''N'
NH?P MÔN L?P TRÌNH 2112/23/2009
? 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”
? Nh?p chu?i có kho?ng tr?ng dùng hàm gets
char name[100];
printf("Nhap mot chuoi ky tu %s: ");
gets(name);
char name[100];
printf("Nhap mot chuoi ky tu %s: ");
gets(name);
Chu?i ký t? - Nh?p / xu?t
char other[] = "Tony Blurt";
printf("%s\n", other);
char other[] = "Tony Blurt";
printf("%s\n", other);
NH?P MÔN L?P TRÌNH 2212/23/2009
??u ý: k?t thúc chu?i
#include
int main()
{
char other[] = "Tony Blurt";
printf("%s\n", other);
other[4] = '\0';
printf("%s\n", other);
return 0;
}
#include
int main()
{
char other[] = "Tony Blurt";
printf("%s\n", other);
other[4] = '\0';
printf("%s\n", other);
return 0;
}
Tony Blurt
Tony
Tony Blurt
Tony
other
"Blurt" s? không
???c in ra
32 'B' 'l' 'u' 'r' 0't''y'‘n’'o''T'
NH?P MÔN L?P TRÌNH 2312/23/2009
Chu?i ký t? – M?t s? hàm th? vi?n
? 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);
NH?P MÔN L?P TRÌNH 2412/23/2009
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
Phân bi?t IN HOA – in th??ng:
int strcmp(const char *s1, const char *s2);
Không phân bi?t IN HOA – in th??ng:
int stricmp(const char *s1, const char *s2);
NH?P MÔN L?P TRÌNH 2512/23/2009
#include
int main()
{
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;
}
#include
int main()
{
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
Minor < TonyMinor < Tony
NH?P MÔN L?P TRÌNH 2612/23/2009
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 source sang chu?i dest:
int strcpy(char *dest, const char *src);
o Chép t?i ?a n ký t? t? source sang dest:
int strncpy(char *dest,
const char *src, int n);
? T?o chu?i m?i t? chu?i ?ã có:
char *strdup(const char *src);
NH?P MÔN L?P TRÌNH 2712/23/2009
#include
int main()
{
char s[] = "Tony 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;
}
#include
int main()
{
char s[] = "Tony 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
Tony Blurt
To123Blurt
Blurt
Tony Blurt
To123Blurt
Blurt
NH?P MÔN L?P TRÌNH 2812/23/2009
Chu?i ký t? – M?t s? hàm th? vi?n
? N?i chu?i:
char *strcat(char *dest,
const char *src);
? Tách chu?i:
char *strtok(char *s,
const char *sep);
Tr? v? ??a ch? c?a ?o?n ??u tiên. Mu?n tách ?o?n k? ti?p
tham s? th? nh?t s? là NULL
NH?P MÔN L?P TRÌNH 2912/23/2009
#include
#define SEPARATOR "., "
int main()
{
char s[]= "Thu strtok: 9,123.45";
char *p;
p = strtok(s, SEPARATOR);
while (p != NULL) {
printf("%s\n", p);
p = strtok(NULL, SEPARATOR);
}
return 0;
}
#include
#define SEPARATOR "., "
int main()
{
char s[]= "Thu strtok: 9,123.45";
char *p;
p = strtok(s, SEPARATOR);
while (p != NULL) {
printf("%s\n", p);
p = strtok(NULL, SEPARATOR);
}
return 0;
}
Chu?i ký t? – ví d? strtok
Thu
strtok:
9
123
45
Thu
strtok:
9
123
45
NH?P MÔN L?P TRÌNH 3012/23/2009
Chu?i ký t? – M?t s? hàm th? vi?n
? Tìm m?t ký t? trên chu?i:
char *strchr(const char *s, int c);
? Tìm m?t ?o?n ký t? trên chu?i:
char *strstr(const char *s1,
const char *s2);
NH?P MÔN L?P TRÌNH 3112/23/2009
#include
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);
return 0;
}
#include
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);
return 0;
}
Chu?i ký t? – ví d? tìm ki?m
m kiem chuoi
em chuoi
m kiem chuoi
em chuoi
NH?P MÔN L?P TRÌNH 3212/23/2009
#include
void StrIns(char *s, char *sub)
{
int len = strlen(sub);
memmove(s + len, s, strlen(s)+1);
strncpy(s, sub, len);
}
int main()
{
char s[]= "Thu chen";
StrIns(s, "123"); printf("%s\n", s);
StrIns(s + 8, "45"); printf("%s\n", p);
return 0;
}
#include
void StrIns(char *s, char *sub)
{
int len = strlen(sub);
memmove(s + len, s, strlen(s)+1);
strncpy(s, sub, len);
}
int main()
{
char s[]= "Thu chen";
StrIns(s, "123"); printf("%s\n", s);
StrIns(s + 8, "45"); printf("%s\n", p);
return 0;
}
Chu?i ký t? – chèn m?t ?o?n ký t?
123 Thu chen
123 Thu 45chen
123 Thu chen
123 Thu 45chen
NH?P MÔN L?P TRÌNH 3312/23/2009
#include
void StrDel(char *s, int n)
{
memmove(s, s + n, strlen(s+n)+1);
}
int main()
{
char s[]= "Thu xoa 12345";
StrDel(s, 4); printf("%s\n", s);
StrDel(s + 4, 3); printf("%s\n", p);
return 0;
}
#include
void StrDel(char *s, int n)
{
memmove(s, s + n, strlen(s+n)+1);
}
int main()
{
char s[]= "Thu xoa 12345";
StrDel(s, 4); printf("%s\n", s);
StrDel(s + 4, 3); printf("%s\n", p);
return 0;
}
Chu?i ký t? – xóa m?t ?o?n ký t?
xoa 12345
xoa 45
xoa 12345
xoa 45
NH?P MÔN L?P TRÌNH 3412/23/2009
Tóm l??c
? 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
Các file đính kèm theo tài liệu này:
bai_giang_nhap_mon_lap_trinh_con_tro_chuoi_tran_phuoc_tuan.pdf



