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
17 trang |
Chia sẻ: phuongt97 | Lượt xem: 491 | Lượt tải: 0
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
tranphuoctuan.khoatoan.dhsp@gmail.com
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