Tải bản đầy đủ (.pdf) (17 trang)

Bài giảng nhập môn lập trình con trỏ, chuỗi trần phước tuấn

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (258.2 KB, 17 trang )

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à

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



×