
VC
VC
&
&
BB
BB
11
N i dungộ
NMLT - Con tr nâng caoỏ
Con trỏ cấp 21
Con trỏ và mảng nhiều chiều2
Mảng con trỏ3
Con trỏ hàm4

VC
VC
&
&
BB
BB
22
Con tr c p 2 (con tr ỏ ấ ỏ đến con tr )ỏ
Đặt vấn đề
Làm sao thay đổi giá trị của con trỏ (không
phải giá trị mà nó trỏ đến) sau khi gọi hàm?
NMLT - Con tr nâng caoỏ
void CapPhat(int *p, int n)
{
p = (int *)malloc(n * sizeof(int));
}
void main()
{
int *a = NULL;
CapPhat(a, 2);
// a vẫn = NULL
}

VC
VC
&
&
BB
BB
33
NULL
Con tr c p 2ỏ ấ
NMLT - Con tr nâng caoỏ
……
int *a = NULL
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
int *p
int *p
int n
int nCapPhat
……
18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25
int *p
N
N
U
U
L
L
L
L
N
N
U
U
L
L
L
L
2
02
02
00
00
00
00
00
00
int n
22
22
00
00
00
00
00
00

VC
VC
&
&
BB
BB
44
Con tr c p 2ỏ ấ
Giải pháp
Sử dụng tham chiếu int *&p (trong C++)
Không thay đổi trực tiếp tham số mà trả về
NMLT - Con tr nâng caoỏ
int* CapPhat(int n)
{
int *p = (int *)malloc(n * sizeof(int));
return p;
}
void CapPhat(int *&p, int n)
{
p = (int *)malloc(n * sizeof(int));
}

VC
VC
&
&
BB
BB
55
Con tr c p 2ỏ ấ
Giải pháp
Sử dụng con trỏ p trỏ đến con trỏ a này. Hàm
sẽ thay đổi giá trị của con trỏ â gián tiếp thông
qua con trỏ p.
NMLT - Con tr nâng caoỏ
void CapPhat(int **p, int n)
{
*p = (int *)malloc(n * sizeof(int));
}
void main()
{
int *a = NULL;
CapPhat(&a, 4);
}

