Phạm Đình Sắc dinhsac@gmail.com Trường Cao đẳng Kỹ thuật Công nghệ Đồng Nai Khoa Công nghệ thông tin NHẬP MÔN LẬP TRÌNH CON TRỎ CƠ BẢN VC & BB 22 Nội dung Khái niệm và cách sử dụng 1 Các
Trang 1Phạm Đình Sắc
dinhsac@gmail.com
Trường Cao đẳng Kỹ thuật Công nghệ Đồng Nai
Khoa Công nghệ thông tin
NHẬP MÔN LẬP TRÌNH
CON TRỎ (CƠ BẢN)
VC &
BB
22
Nội dung
Khái niệm và cách sử dụng
1
Các cách truyền đối số cho hàm
2
Con trỏ và mảng một chiều
3
Con trỏ và cấu trúc
4
Trang 2VC &
BB
33
Khai báo con trỏ
Khai báo
Giống như mọi biến khác, biến con trỏ muốn sử dụng cũng cần phải được khai báo
Ví dụ
ch1 và ch2 là biến con trỏ, trỏ tới vùng nhớ kiểu char (1 byte)
p1 là biến con trỏ, trỏ tới vùng nhớ kiểu int (2 bytes) còn p2 là biến kiểu int bình thường
NMLT - Con trỏ cơ bản
<ki ể u d ữ li ệ u> * <tên bi ế n con tr ỏ >;
char * ch1, * ch2;
int * p1, p2;
VC &
BB
44
Con trỏ NULL
Khái niệm
NULL
int n;
int *p1 = &n;
int *p2; // unreferenced local varialbe
int *p3 = NULL;
Trang 3VC &
BB
55
Khởi tạo kiểu con trỏ
Khởi tạo
nào đó (không biết trước)
trỏ đến vùng nhớ không biết trước
Đặt địa chỉ của biến vào con trỏ (toán tử &)
Ví dụ
NMLT - Con trỏ cơ bản
<tên bi ế n con tr ỏ > = & <tên bi ế n>;
int a, b;
int *pa = & a, *pb;
pb = & b;
VC &
BB
66
Sử dụng con trỏ
Truy xuất đến ô nhớ mà con trỏ trỏ đến
Ví dụ
NMLT - Con trỏ cơ bản
int a = 5, *pa = & a;
printf( “ %d\n ” , pa); // Giá tr ị bi ế n pa
printf( “ %d\n ” , *pa); // Giá tr ị vùng nh ớ pa tr ỏ đế n printf( “ %d\n ” , &pa); // Đị a ch ỉ bi ế n pa
…
…
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
0B 00 00 00
05 00 00 00
Trang 4VC &
BB
77
Kích thước của con trỏ
Kích thước của con trỏ
trỏ là như nhau:
• Môi trường MD-DOS ( 16 bit ): 2 bytes
• Môi trường Windows ( 32 bit ): 4 bytes
NMLT - Con trỏ cơ bản
char * p1;
int * p2;
float *p3;
double *p4;
…
VC &
BB
88
Các cách truyền đối số
Truyền giá trị (tham trị)
#include <stdio.h>
void hoanvi(int x, int y);
void main()
{
int a = 5; b = 6;
hoanvi(a, b);
printf( “ a = %d, b = %d ” , a, b);
}
void hoanvi( int x , int y )
{
int t = x; x = y; y = t;
}
Trang 5VC &
BB
99
Các cách truyền đối số
Truyền tham chiếu
NMLT - Con trỏ cơ bản
#include <stdio.h>
void hoanvi(int & x, int & y);
void main()
{
int a = 5; b = 6;
hoanvi(a, b);
printf( “ a = %d, b = %d ” , a, b);
}
void hoanvi(int & x, int & y)
{
int t = x; x = y; y = t;
}
VC &
BB
10
Các cách truyền đối số
Truyền địa chỉ (con trỏ)
#include <stdio.h>
void hoanvi(int * x, int * y);
void main()
{
int a = 5; b = 6;
hoanvi( & a, & b);
printf( “ a = %d, b = %d ” , a, b);
}
void hoanvi(int * x, int * y)
{
int t = * x; * x = * y; * y = t;
}
Trang 6VC &
BB
11
Một số lưu ý
Một số lưu ý
C Mức độ thành thạo C được đánh giá qua mức
độ sử dụng con trỏ
Nắm rõ quy tắc sau, ví dụ int a, *pa = &a;
• *pa và a đều chỉ nội dung của biến a.
• pa và &a đều chỉ địa chỉ của biến a.
Không nên sử dụng con trỏ khi chưa được khởi tạo Kết quả sẽ không lường trước được
NMLT - Con trỏ cơ bản
VC &
BB
12
Con trỏ và mảng một chiều
Mảng một chiều
không thể thay đổigiá trị của hằng này
array ==&array[0]
int array[3];
…
…
array
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
Trang 7VC &
BB
13
Con trỏ đến mảng một chiều
… Con trỏ và mảng một chiều
NMLT - Con trỏ cơ bản
int array[3], *parray;
parray = array; // Cách 1
parray = &array[0]; // Cách 2
…
…
array
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
…
18 19 1A 1B 1C 1D 1E 1F
parray
0B 00 00 00
VC &
BB
14
Phép cộng (tăng)
+ n + n * sizeof(<kiểu dữ liệu>)
+2 Phép toán số học trên con trỏ
…
…
p = array
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
+1
int array [3];
Trang 8VC &
BB
15
Phép trừ (giảm)
– n – n * sizeof(<kiểu dữ liệu>)
Phép toán số học trên con trỏ
NMLT - Con trỏ cơ bản
p = &array[2]
–1 –2
…
…
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
int array [3];
VC &
BB
16
Các phép toán khác
(thứ tự ô nhớ)
• == !=
• > >=
• < <=
Phép toán số học trên con trỏ
Trang 9VC &
BB
17
Truy xuất đến phần tử thứ n của mảng (không sử dụng biến mảng)
array[n] == p[n] == *(p + n)
Con trỏ và mảng một chiều
NMLT - Con trỏ cơ bản
…
…
p
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
int array [3], *p;
+ 2 )
(
*
VC &
BB
18
Con trỏ và mảng một chiều
Ví dụ nhập - xuất mảng
NMLT - Con trỏ cơ bản
void nhap(int *a, int &n)
{ printf("\n nhap so phan tu: ");
scanf("%d",&n);
for (int i = 0; i<n; i++)
{
printf("a[%d] = ", i );
scanf("%d", &a[i] );
}
}
void xuat(int *a, int n)
{ for (int i = 0; i<n; i++)
printf( “ %d ” a[i] );
}
void main()
{ int n = 10, *a;
nhap(a,n); xuat (a,n) ;
}
Trang 10VC &
BB
19
Con trỏ và mảng một chiều
Ví dụ nhập - xuất mảng
NMLT - Con trỏ cơ bản
void nhap(int *a, int &n)
{ printf("\n nhap so phan tu: ");
scanf("%d",&n);
for (int i = 0; i<n; i++)
{
printf("a[%d] = ", i );
scanf("%d", &*a++ );
}
}
void xuat(int *a, int n)
{ for (int i = 0; i<n; i++)
printf( “ %d ” *a++ );
}
void main()
{ int n = 10, *a;
nhap(a,n); xuat (a,n) ;
}
VC &
BB
20
Con trỏ và chuỗi
Ví dụ Chuong trinh nhap va in ra ten*
#include <stdio.h>
#include <conio.h>
void main()
{
char *strChao = "Chao ban";
char strTen[30];
puts("Cho biet ten cua ban: ");
gets(strTen);
puts(strChao);
puts(strTen);
getch();
}
Trang 11VC &
BB
21
Bài tập lý thuyết
Bài 1: Cho đoạn chương trình sau:
int a = 234;
int *ptr_a;
ptr_a = &a;
Hãy cho biết giá trị của:
b *ptr_a // printf("%d ", *ptr_a);
c &ptr_a // printf("%d ", &ptr_a);
d &a // printf("%d ", &a);
e *a // printf("%d ", *a);
Tin học cơ sở 2 - Đặng Bình Phương
VC &
BB
22
Bài tập lý thuyết
Bài 2: Kết quả ?
#include<stdio.h>
#include<conio.h>
void main()
{
int *x, y = 2;
*x = y;
*x += y; // (1)
y++; // (2) *x += y++;
printf("%d %d", *x, y);
getch();
}
Trang 12VC &
BB
23
Bài tập lý thuyết
một biến?
do con trỏ trỏ đến?
bộ nhớ như thế nào?
lấy địa chỉ phần tử đầu tiên của mảng này
Tin học cơ sở 2 - Đặng Bình Phương
VC &
BB
24
Bài tập lý thuyết
chiều Trình bày hai cách nhận biết phần tử cuối của mảng?
con trỏ?
trỏ p2 trỏ đến phần tử thứ 4 của mảng int p2 – p1 =
?
float?
Trang 13VC &
BB
25
Bài tập
kiểu char
con trỏ pcost trỏ đến biến này
cách trực tiếp và gián tiếp
nó trỏ tới
mảng một chiều
Tin học cơ sở 2 - Đặng Bình Phương
VC &
BB
26
Bài tập lý thuyết
Bài 15: Cho đoạn chương trình sau:
int *pint;
float a;
char c;
double *pd;
Hãy chọn phát biểu sai cú pháp:
a a = *pint;
b c = *pd;
c *pint = *pd;
d pd = a;
Trang 14VC &
BB
27
Bài tập thực hành
Bài 16:Viết chương trình nhập số nguyên dương n gồm k chữ số (0 < k ≤ 5) , sắp xếp các chữ số của n theo thứ tự tăng dần
Ví dụ:
Tin học cơ sở 2 - Đặng Bình Phương