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:
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*
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
}}
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
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ý
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
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
=
=
&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)
*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
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]
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
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;
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;
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á
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
'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[]
#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
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
printf("%s
printf("%s > %s",
%s", s1,
s1, s2);
s2);
return
0;
return 0;
}}
NH P MÔN L P TRÌNH
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,
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";
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
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");
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);
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