tranphuoctuan.khoatoan.dhsp@gmail.com http://baigiang.tranphuoctuan.com
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
Trang 2NH P MÔN L P TRÌNH 12/23/2009 3
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
Ki u con tr ph i c nh ngh a trên m t ki u c s ã
c nh ngh a tr c ó.
//PINT là ki u con tr - a ch vùng nh ki u int
Trang 3NH P MÔN L P TRÌNH 12/23/2009 5
long int *p;
e and f are double */
long int *p;
e and f are double */
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';
{
char c = 'a';
char *p;
p = &c;
p = &g;
return 0;
}
char g = 'z';
{
char c = 'a';
char *p;
p = &c;
p = &g;
return 0;
}
'a' 0x1132
'z' 0x91A2
Trang 4NH P MÔN L P TRÌNH 12/23/2009 7
“ * ”: toán t truy xu t giá tr c a vùng nh c qu n lý
b i con tr
#include <stdio.h>
char g = 'z';
{
char c = 'a';
char *p;
p = &c;
printf("%c\n", *p);
p = &g;
printf("%c\n", *p);
return 0;
}
#include <stdio.h>
char g = 'z';
{
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ý
0x91A2
0x1132
'a' 0x1132
'z' 0x91A2
#include <stdio.h>
{
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 <stdio.h>
{
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));
}
Trang 5NH P MÔN L P TRÌNH 12/23/2009 9
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 <stdio.h>
int main() {
int i = 13;
if (p == NULL)
else
return 0;
}
#include <stdio.h>
int main() {
int i = 13;
if (p == NULL)
else
return 0;
}
0x15A0
0x15A4 0x15A0
Có s khác bi t r t quan tr ng khi th c hi n các phép gán:
int* p = &i;
*p = *q;
int* p = &i;
*p = *q;
p = q;
p = q;
và:
10
10 0x15A0
0x15A4
0x15A4
14 0x15A4
Trang 6NH P MÔN L P TRÌNH 12/23/2009 11
{
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 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
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 <stdio.h>
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 <stdio.h>
int main() {
int a[10] = {1, 3, 4, 2, 0};
int *p;
printf(“0x%04X %i 0x%04X %i\n“, );
a, a[0], p, *p);
return 0;
}
Trang 7NH P MÔN L P TRÌNH 12/23/2009 13
3
0x15A0
#include <stdio.h>
int main()
{
short a[10] = {1, 3, 5, 2, 0};
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 <stdio.h>
int main()
{
short a[10] = {1, 3, 5, 2, 0};
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
#include <stdio.h>
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]);
printf(“%i %i\n“, p[1], *p);
p -= 2;
printf(“%i %i\n”, p[3], p[1]);
return 0;
}
#include <stdio.h>
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]);
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
Trang 8NH P MÔN L P TRÌNH 12/23/2009 15
#include <stdio.h>
{
int *p = new int[10];
p[0] = 1;
p[3] = -7;
delete []p;
return 0;
}
#include <stdio.h>
{
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)
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
Trang 9Chu i ký t - String
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
Trang 10NH P MÔN L P TRÌNH 12/23/2009 19
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 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
0 'n' 'h' 'o' 'J'
0 'r' 'o' 'n' 'i' 'M'
'y'
‘n’
'o' 'T'
'u' 'n' 32 'o' 'N'
Trang 11NH P MÔN L P TRÌNH 12/23/2009 21
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
printf("Nhap mot chuoi ky tu %s: ");
gets(name);
char name[100];
printf("Nhap mot chuoi ky tu %s: ");
gets(name);
printf("%s\n", other);
char other[] = "Tony Blurt";
printf("%s\n", other);
#include <stdio.h>
{
char other[] = "Tony Blurt";
printf("%s\n", other);
other[4] = '\0';
printf("%s\n", other);
return 0;
}
#include <stdio.h>
{
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
'y'
‘n’
'o' 'T'
Trang 12NH P MÔN L P TRÌNH 12/23/2009 23
L y dài chu i
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);
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);
Trang 13NH P MÔN L P TRÌNH 12/23/2009 25
#include <stdio.h>
int main()
{
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 <stdio.h>
int main()
{
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;
}
Minor < Tony
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);
Trang 14NH P MÔN L P TRÌNH 12/23/2009 27
#include <stdio.h>
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 <stdio.h>
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;
}
Tony Blurt To123Blurt Blurt
Tony Blurt To123Blurt Blurt
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
Trang 15NH P MÔN L P TRÌNH 12/23/2009 29
#include <stdio.h>
#define SEPARATOR "., "
int main()
{
char s[]= "Thu strtok: 9,123.45";
char *p;
p = strtok(s, SEPARATOR);
printf("%s\n", p);
p = strtok(NULL, SEPARATOR);
} return 0;
}
#include <stdio.h>
#define SEPARATOR "., "
int main()
{
char s[]= "Thu strtok: 9,123.45";
char *p;
p = strtok(s, SEPARATOR);
printf("%s\n", p);
p = strtok(NULL, SEPARATOR);
} return 0;
}
Thu strtok: 9
123 45
Thu strtok: 9
123 45
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);
Trang 16NH P MÔN L P TRÌNH 12/23/2009 31
#include <stdio.h>
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 <stdio.h>
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;
}
m kiem chuoi
em chuoi
m kiem chuoi
em chuoi
#include <stdio.h>
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 + 8, "45"); printf("%s\n", p);
return 0;
#include <stdio.h>
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 + 8, "45"); printf("%s\n", p);
return 0;
}
123 Thu chen
123 Thu 45chen
123 Thu chen
123 Thu 45chen
Trang 17NH P MÔN L P TRÌNH 12/23/2009 33
#include <stdio.h>
void StrDel(char *s, int n)
{
memmove(s, s + n, strlen(s+n)+1);
}
int main()
{
char s[]= "Thu xoa 12345";
return 0;
}
#include <stdio.h>
void StrDel(char *s, int n)
{
memmove(s, s + n, strlen(s+n)+1);
}
int main()
{
char s[]= "Thu xoa 12345";
return 0;
}
xoa 12345 xoa 45
xoa 12345 xoa 45
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