NMLT
CON TR , CHU I
Tr n Ph
c Tu n
Con tr – Pointer
Khai báo
Các toá
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
12/23/2009
2
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
3
12/23/2009
Con tr – Khai báo trong C
Ki u con tr ph i
c nh ngh a tr
c
int
//PINT là ki u con tr -
int
PINT
int
NH P MÔN L P TRÌNH
ã
c ó.
typedef ki uc s
typedef
nh ngh a trên m t ki u c s
*Tênki u;
*PINT;
a ch vùng nh ki u int
x;
p; //p, p1: bi n ki u int *
*p1;
12/23/2009
4
Con tr – Khai báo trong C
int
int
*pi;
*pi;
long
long int
int *p;
*p;
float*
float*
pf;
pf;
char
char
c,
c, d,
d, *pc;
*pc; /*
/* cc và
và dd ki
ki uu char
char
pc
nn char
pc là
là con
con tr
tr
char */
*/
double*
double* pd,
pd, e,
e, f;
f;
char
char
/*
/* pd
pd là
là
ee and
and
con
nn double
con tr
tr
double
ff are
are double
double */
*/
*start,
*start, *end;
*end;
NH P MÔN L P TRÌNH
5
12/23/2009
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
c ch nh t khi khai báo
ng trình
u ã
char
char gg == 'z';
'z';
int
int main()
main()
{{
char
char cc == 'a';
'a';
char
*p;
char *p;
pp == &c;
&c;
pp == &g;
&g;
return
return 0;
0;
}}
NH P MÔN L P TRÌNH
p
0x1132
p
0x91A2
12/23/2009
c
0x1132
'a'
g
0x91A2
'z'
6
Con tr - Toán t “*”
“*”: toán t truy xu t giá tr c a vùng nh
b i con tr .
#include
#include <stdio.h>
<stdio.h>
char
g
=
'z';
char g = 'z';
int
int main()
main()
{{
char
char cc == 'a';
'a';
char
*p;
char *p;
pp == &c;
&c;
printf("%c\n",
printf("%c\n",
pp == &g;
&g;
printf("%c\n",
printf("%c\n",
return
return 0;
0;
}}
c qu n lý
p
0x1132
aa
zz
*p);
*p);
NH P MÔN L P TRÌNH
0x1132
'a'
g
p
0x91A2
*p);
*p);
c
0x91A2
'z'
xu t giá tr do p ang
qu n lý
7
12/23/2009
Con tr - Truy n tham s
a ch
#include
#include <stdio.h>
<stdio.h>
void
void change(int
change(int *v);
*v);
int
int main()
main()
{{
int
int var
var == 5;
5;
change(&var);
change(&var);
printf("main:
printf("main: var
var == %i\n",
%i\n", var);
var);
return
0;
return 0;
}}
void
voidchange(int
change(int *v)
*v)
{{
(*v)
(*v) *=
*= 100;
100;
printf("change:
printf("change: *v
*v == %i\n",
%i\n", (*v));
(*v));
}}
NH P MÔN L P TRÌNH
12/23/2009
8
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
#include <stdio.h>
<stdio.h>
int
main()
int main()
{{
int
int ii == 13;
13;
short
*p
short *p == NULL;
NULL;
if
(p
==
NULL)
if (p == NULL)
printf(“Con
printf(“Con tr
tr không
không hh pp
else
else
printf(“Giá
printf(“Giá tr
tr :: %hi\n",
%hi\n",
return
0;
return 0;
}}
NH P MÔN L P TRÌNH
ll !\n");
!\n");
*p);
*p);
9
12/23/2009
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
int ii == 10,
10, jj == 14;
14;
int*
int* pp == &i;
&i;
int
*q
=
&j;
int *q = &j;
*p
*p == *q;
*q;
p
0x15A0
q
0x15A4
i
10 14
0x15A0
j
14
0x15A4
và:
int
int
int
int
int
int
ii == 10,
10, jj == 14;
14;
*p
=
&i;
*p = &i;
*q
*q == &j;
&j;
pp == q;
q;
NH P MÔN L P TRÌNH
p 0x15A4
0x15A0
q
0x15A4
12/23/2009
i
0x15A0
j
0x15A4
10
14
10
Luy n t p – i n vào ô tr ng
int
int main(void)
main(void)
{{
int
int ii == 10,
10, jj == 14,
14, k;
k;
int
*p
=
&i;
int *p = &i;
int
int *q
*q == &j;
&j;
*p
*p +=
+= 1;
1;
pp == &k;
&k;
*p
=
*p = *q;
*q;
pp == q;
q;
*p
*p == *q;
*q;
return
return 0;
0;
i
0x2100
j
0x2104
k
0x1208
p
0x120B
q
0x1210
}}
NH P MÔN L P TRÌNH
11
12/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
#include <stdio.h>
<stdio.h>
int
main()
int main()
{{
int
int a[10]
a[10] == {1,
{1, 3,
3, 4,
4, 2,
2,
int
*p;
int *p;
pp == a;
a; //a
//a == p:
p: sai
sai
printf(“0x%04X
printf(“0x%04X %i
%i 0x%04X
0x%04X
a,
a[0],
p,
a, a[0], p, *p);
*p);
return
0;
return 0;
}}
NH P MÔN L P TRÌNH
12/23/2009
0};
0};
%i\n“,
%i\n“, );
);
12
Con tr - Toán t “+” v i s nguyên
#include
#include <stdio.h>
<stdio.h>
int
main()
int main()
{{
short
short a[10]
a[10] == {1,
{1, 3,
3, 5,
5, 2,
2, 0};
0};
short
*p
=
a;
short *p = a;
printf(“0x%04X
printf(“0x%04X %i
%i 0x%04X
0x%04X %i\n“,
%i\n“,
a,
a[0],
p,
*p);
a, a[0], p, *p);
pp ++;
++;
printf(“0x%04X
printf(“0x%04X %i
%i 0x%04X
0x%04X %i\n“,
%i\n“,
a,
a[0],
p,
*p);
a, a[0], p, *p);
(*p)
++;
(*p) ++;
printf(“0x%04X
printf(“0x%04X %i
%i 0x%04X
0x%04X %i\n“,
%i\n“,
a,
a[0],
p,
*p);
a, a[0], p, *p);
return
0;
return 0;
}}
NH P MÔN L P TRÌNH
0x15A0
a
1
4
3
5
2
);
);
0
…
);
);
);
);
0x16B2
p
0x15A0
0x15A2
13
12/23/2009
Con tr - Luy n t p
#include
#include <stdio.h>
<stdio.h>
int
main()
int main()
{{
int
int a[10]
a[10] == {2,
{2, 3,
3, 5,
5, 1,
1, 4,
4, 7,
7, 0};
0};
int
*p
=
a;
int *p = a;
printf(“%i
printf(“%i %i\n“,
%i\n“, a[0],
a[0], *p);
*p);
pp ++;
++;
printf(“%i
printf(“%i %i\n“,
%i\n“, *p,
*p, p[2]);
p[2]);
pp ++;
a[2]
=
9;
++; a[2] = 9;
printf(“%i
printf(“%i %i\n“,
%i\n“, p[1],
p[1], *p);
*p);
pp -=
2;
-= 2;
printf(“%i
printf(“%i %i\n”,
%i\n”, p[3],
p[3], p[1]);
p[1]);
return
return 0;
0;
}}
NH P MÔN L P TRÌNH
12/23/2009
22
33
11
11
22
11
99
33
14
Con tr - C p phát vùng nh
ng
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)
#include
#include <stdio.h>
<stdio.h>
int
main()
int main()
{{
int
int *p
*p == new
new int[10];
int[10];
p[0]
=
1;
p[0] = 1;
p[3]
p[3] == -7;
-7;
delete
[]p;
delete []p;
return
return 0;
0;
}}
NH P MÔN L P TRÌNH
Tóm l
12/23/2009
15
c
Khai báo
Các toá
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
12/23/2009
16
Chu i ký t - String
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
12/23/2009
18
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á
báo và
và truy n tham s nh m ng m t chi u.
char
char
unsigned
unsigned char
char
NH P MÔN L P TRÌNH
s[100];
s[100];
s1[1000];
s1[1000];
19
12/23/2009
Chu i ký t - Ví d
char
char first_name[5]
first_name[5] == {{ 'J',
'J', 'o',
'o', 'h',
'h', 'n',
'n', '\0'
'\0' };
};
char
char last_name[6]
last_name[6] == "Minor";
"Minor";
char
char other[]
other[]
== "Tony
"Tony Blurt";
Blurt";
char
char characters[7]
characters[7] == "No
"No null";
null";
first_name
'J'
'o'
'h'
'n'
0
last_name
'M'
'i'
'n'
'o'
'r'
other
'T'
'o' ‘n’
'y'
32 'B'
characters
NH P MÔN L P TRÌNH
'N' 'o'
32
'n' 'u'
0
'l'
12/23/2009
'l'
'u'
'l'
0
'r'
't'
0
20
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 as
Ho c s d ng các hàm scanf và printf v i ký t
nh
d ng “%s”
char
char other[]
other[] == "Tony
"Tony Blurt";
Blurt";
printf("%s\n",
printf("%s\n", other);
other);
Nh p chu i có kho ng tr ng dùng hàm gets
char
char name[100];
name[100];
printf("Nhap
printf("Nhap mot
mot chuoi
chuoi ky
ky tu
tu %s:
%s: ");
");
gets(name);
gets(name);
NH
P MÔN L P TRÌNH
21
12/23/2009
u ý: k t thúc chu i
#include
#include <stdio.h>
<stdio.h>
int
int main()
main()
{{
char
char other[]
other[] == "Tony
"Tony Blurt";
Blurt";
"Blurt" s không
c in ra
printf("%s\n",
printf("%s\n", other);
other);
other[4]
other[4] == '\0';
'\0';
printf("%s\n",
printf("%s\n", other);
other);
Tony
Tony Blurt
Blurt
Tony
Tony
return
return 0;
0;
}}
other
NH P MÔN L P TRÌNH
'T' 'o' ‘n’ 'y' 32 'B' 'l'
12/23/2009
'u' 'r'
't'
0
22
Chu i ký t – M t s hàm th vi n
L y
dài chu i
l = strlen(s);
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
12/23/2009
23
Chu i ký t – M t s hàm th vi n
So sánh chu i: so sánh theo th t t
Phân bi t IN HOA – in th
i n
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
12/23/2009
24
Chu i ký t – ví d strcmp
#include
#include <stdio.h>
<stdio.h>
int
int main()
main()
Minor
Minor << Tony
Tony
{{
char
char s1[]
s1[] == "Minor";
"Minor";
char
s2[]
=
"Tony";
char s2[] = "Tony";
int
int cmp
cmp == strcmp(s1,
strcmp(s1, s2);
s2);
if
(cmp
<
0)
if (cmp < 0)
printf("%s
printf("%s << %s",
%s", s1,
s1, s2);
s2);
else
else
if
if (cmp
(cmp ==
== 0)
0)
printf("%s
printf("%s == %s",
%s", s1,
s1, s2);
s2);
else
else
printf("%s
printf("%s >> %s",
%s", s1,
s1, s2);
s2);
return
0;
return 0;
}}
NH P MÔN L P TRÌNH
12/23/2009
25
Chu i ký t – M t s hàm th vi n
Gán n i dung chu i:
o Ché
Chép toà
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
12/23/2009
26
Chu i ký t – ví d strcpy
#include
#include <stdio.h>
<stdio.h>
int
int main()
main()
{{
char
char s[]
s[] == "Tony
"Tony Blurt";
Blurt";
char
s2[100],
*s3;
char s2[100], *s3;
Tony
Tony Blurt
Blurt
To123Blurt
To123Blurt
Blurt
Blurt
strcpy(s2,
strcpy(s2, s);
s);
printf("%s\n",
printf("%s\n", s2);
s2);
strncpy(s2
+
2,
strncpy(s2 + 2, "12345",
"12345", 3);
3);
printf("%s\n",
s2);
printf("%s\n", s2);
s3
s3 == strdup(s
strdup(s ++ 5);
5);
printf("%s\n",
s3);
printf("%s\n", s3);
free(s3);
free(s3);
return
return 0;
0;
}}
NH P MÔN L P TRÌNH
12/23/2009
27
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
12/23/2009
28
Chu i ký t – ví d strtok
#include
#include <stdio.h>
<stdio.h>
#define
#define SEPARATOR
SEPARATOR ".,
"., ""
int
int main()
main()
{{
char
char s[]=
s[]= "Thu
"Thu strtok:
strtok: 9,123.45";
9,123.45";
char
*p;
char *p;
Thu
Thu
strtok:
strtok:
99
123
123
45
45
pp == strtok(s,
strtok(s, SEPARATOR);
SEPARATOR);
while
(p
!=
NULL)
while (p != NULL) {{
printf("%s\n",
printf("%s\n", p);
p);
pp == strtok(NULL,
strtok(NULL, SEPARATOR);
SEPARATOR);
}}
return
return 0;
0;
}}
NH P MÔN L P TRÌNH
12/23/2009
29
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
12/23/2009
30
Chu i ký t – ví d tìm ki m
#include
#include <stdio.h>
<stdio.h>
int
int main()
main()
{{
char
char s[]=
s[]= "Thu
"Thu tim
tim kiem
kiem chuoi";
chuoi";
char
*p;
char *p;
pp == strchr(s,
strchr(s, 'm');
'm');
printf("%s\n",
printf("%s\n", p);
p);
pp == strstr(s,
strstr(s, "em");
"em");
printf("%s\n",
printf("%s\n", p);
p);
return
0;
return 0;
m
mkiem
kiemchuoi
chuoi
em
emchuoi
chuoi
}}
NH P MÔN L P TRÌNH
12/23/2009
31
Chu i ký t – chèn m t o n ký t
#include
#include <stdio.h>
<stdio.h>
void
void StrIns(char
StrIns(char *s,
*s, char
char *sub)
*sub)
{{
int
int len
len == strlen(sub);
strlen(sub);
memmove(s
+
memmove(s + len,
len, s,
s, strlen(s)+1);
strlen(s)+1);
strncpy(s,
strncpy(s, sub,
sub, len);
len);
}}
123
123Thu
Thuchen
chen
int
main()
int main()
123
123Thu
Thu45chen
45chen
{{
char
char s[]=
s[]= "Thu
"Thu chen";
chen";
StrIns(s,
StrIns(s, "123");
"123");
StrIns(s
+
StrIns(s + 8,
8, "45");
"45");
return
0;
return 0;
printf("%s\n",
printf("%s\n", s);
s);
printf("%s\n",
p);
printf("%s\n", p);
}}
NH P MÔN L P TRÌNH
12/23/2009
32
Chu i ký t – xóa m t o n ký t
#include
#include <stdio.h>
<stdio.h>
void
void StrDel(char
StrDel(char *s,
*s, int
int n)
n)
{{
memmove(s,
memmove(s, ss ++ n,
n, strlen(s+n)+1);
strlen(s+n)+1);
}}
int
xoa
int main()
main()
xoa12345
12345
{{
xoa
xoa45
45
char
s[]=
"Thu
xoa
12345";
char s[]= "Thu xoa 12345";
StrDel(s,
StrDel(s, 4);
4);
StrDel(s
+
StrDel(s + 4,
4, 3);
3);
return
0;
return 0;
printf("%s\n",
printf("%s\n",
printf("%s\n",
printf("%s\n",
s);
s);
p);
p);
}}
NH P MÔN L P TRÌNH
12/23/2009
Tóm l
33
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
NH P MÔN L P TRÌNH
12/23/2009
34