Professional Documents
Culture Documents
CON TRỎ
1. Giới thiệu
2. Khai báo và khởi tạo
3. Toán tử
4. Truyền đối số cho hàm
5. Các phép toán học con trỏ
6. Con trỏ với mảng
7. Cấp phát vùng nhớ động
1. Giới thiệu con trỏ
• 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
• Lưu trữ dữ liệu trong vùng nhớ heap
• Rất mạnh nhưng khó
• Truyền tham chiếu
• Đặc biệt hay sử dụng trong mảng và chuỗi
2. Khai báo và khởi tạo
• Giá trị của biến con trỏ là địa chỉ ô nhớ
• Con trỏ chứa địa chỉ của biến (chứa giá trị)
• Con trỏ tham chiếu gián tiếp đến giá trị
2. Khai báo và khởi tạo
• Khai báo
int *pi;
float *pf;
char x = 'z';
int main()
{
char y = 'a';
char *p;
p = &y;
p = &x;
return 0;
}
3. Toán tử
• Toán tử “*”
• “*”: toán tử truy xuất giá trị của vùng nhớ được quản lý
bởi con trỏ
char x = 'z';
int main()
{
char y = 'a';
char *p;
p = &y;
printf("%c\n", *p);
p = &x;
printf("%c\n", *p);
return 0;
}
VD: Cho biết kết quả đoạn CT sau nếu địa chỉ của x
và y lần lượt là 0029F758 và 0029F800
char x = ‘ @';
int main(void)
{
char y = ‘ %';
char *p;
p = &y;
printf("p = %p\n&y = %p\ny = %c
\n*p = %c\n", p, &y, y, *p);
p = &x;
printf("\np = %p\n&x = %p\nx = %c
\n*p = %c\n", p, &x, x, *p);
getch();
}
VD: Cho biết kết quả in ra màn hình nếu địa chỉ của
biến a là 0029F758
int a;
int *aPtr;
a = 7;
aPtr = &a;
printf("The address of a is %p\nThe value of
aPtr is %p", &a, aPtr);
printf("\n\nThe value of a is %d\nThe value of
*aPtr is %d", a, *aPtr);
printf("\n\n\n&*aPtr = %p\n*&aPtr = %p\n",
&*aPtr, *&aPtr);
• 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 <stdio.h>
int main()
{
int i = 13;
short *p = NULL;
if (p == NULL)
printf(“Con trỏ không hợp lệ!\n");
else
printf(“Giá trị : %0xi\n", *p);
return 0;
}
3. Toán tử
• Chú ý toán tử gán “ = “
• VD:
*p = *q;
p = q;
BT 1. Cho biết kết quả in ra màn hình
inta,b;
int *p;
p = &a;
*p = 5;
p = &b;
*p = 7;
printf(“a = %d\nb = %d\n", a, b);
getch();
4. Truyền đối số cho hàm
• Truyền tham chiếu
• Truyền địa chỉ đối số sử dụng toán tử “&”
• Cho phép thay đổi vị trí thực trong bộ nhớ
• Mảng không sử dụng toán tử “&” vì bản thân mảng đã là
1 con trỏ
• VD:
void double1( int *number )
{
*number = 2 * ( *number );
}
int cubeByValue(int n)
{ return n * n * n;}
#include <stdio.h>
#include <conio.h>
void cubeByReference(int *nPtr);
int main(void)
{
int number = 5;
printf("The original value of number is %d", number);
cubeByReference(&number);
printf("\nThe new value of number is %d\n", number);
getch();
}