Một cách ngắn gọn: Pointer là một biến lưu địa chỉ của biến khác.
Dài hơn một chút: Pointer là một biến gần giống như biến thông thường ta khai báo khi ta mới học C nhưng điểm khác biệt lớn nhất là ở ứng dụng của pointer, ở giá trị mà nó lưu trữ: là địa chỉ của một biến khác trong bộ nhớ.
1. Khai báo biến con trỏ.
Lưu ý: Để khai báo nhiều biến con trỏ trên một hàng, ta phải đặt dấu
VD:
Trong ví dụ trên,
2. Sử dụng con trỏ:
Để sử dụng con trỏ cần có các toán tử sau:
3. Ứng dụng con trỏ:
Ứng dụng lớn nhất của con trỏ là dùng để truyền tham chiếu. Để hiểu rõ hơn, ta đến với ví dụ sau.
Lưu ý: Trong ví dụ, mục đích của hàm swap là để hoán đổi giá trị giữa hai biến
Các bạn dự đoán output trước khi spoil nhé
.
Giải thích:
Bài tiếp: [C] Variable Pointer (Con trỏ biến) - P2
Dài hơn một chút: Pointer là một biến gần giống như biến thông thường ta khai báo khi ta mới học C nhưng điểm khác biệt lớn nhất là ở ứng dụng của pointer, ở giá trị mà nó lưu trữ: là địa chỉ của một biến khác trong bộ nhớ.
1. Khai báo biến con trỏ.
<Kiểu dữ liệu mà của biến được con trỏ trỏ tới> *<tên biến>;
VD:
C:
int *var0; // Khai báo biến con trỏ có tên là var0 sẽ lưu địa chỉ của một biến có kiểu dữ liệu là int;
double *var1; // Khai báo biến con trỏ có tên là var1 sẽ lưu địa chỉ của một biến có kiểu dữ liệu là double;
* trước mỗi biến.VD:
C:
int *a, *b, *c, d;
a, b, c là biến con trỏ sẽ lưu địa chỉ của một biến có kiểu dữ liệu là int còn d là một biến có kiểu dữ liệu là int.2. Sử dụng con trỏ:
Để sử dụng con trỏ cần có các toán tử sau:
* : toán tử lấy giá trị tại địa chỉ lưu trong con trỏ
& : toán tử lấy địa chỉ của biến.
Kinh tụng: sao(*) giá trị, và(&) địa chỉ
Đọc comment trong ví dụ sau để hiều về cách sử dụng các toán tử trên.
C:
#include <stdio.h>
#include <stdint.h>
int main(){
uint8_t var0 = 10; // Khai báo biến var0
uint8_t *var1; // Khai báo biến con trỏ var1 trỏ tới biến có kiểu dữ liệu là uint8_t
// Dấu * ở đây chỉ là ký hiệu cho biết rằng var1 là biến con trỏ
var1 = &var0; // Gán giá trị biến var1 là địa chỉ của biến var0
uint8_t var2 = *var1; // Khai báo và gán giá trị biến var2 bằng giá trị được lưu tại địa chỉ chứa trong biến var1
printf("var2 = %d", var2);
return 0;
}
var2 = 10
3. Ứng dụng con trỏ:
Ứng dụng lớn nhất của con trỏ là dùng để truyền tham chiếu. Để hiểu rõ hơn, ta đến với ví dụ sau.
Lưu ý: Trong ví dụ, mục đích của hàm swap là để hoán đổi giá trị giữa hai biến
var0 và var1.
C:
#include <stdio.h>
#include <stdint.h>
void swap(int a, int b){
int temp = a;
a = b;
b = temp;
}
void swap_ptr(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
int main(){
int var0 = 10;
int var1 = 20;
swap(var0, var1);
printf("Pass by value: var0=%d var1=%d\n", var0, var1);
swap_ptr(&var0, &var1);
printf("Pass by reference: var0=%d var1=%d\n", var0, var1);
return 0;
}
.Pass by value: var0=10 var1=20
Pass by reference: var0=20 var1=10
Pass by reference: var0=20 var1=10
- Khi ta gọi hàm
swap(var0, var1);thì giá trị củavar0sẽ được copy và lưu vào biến cục bộa, giá trị củavar1sẽ được copy và lưu vào biến cục bộbcủa hàmvoid swap(int a, int b). Do đó khi ta thay đổi giá trị của hai biến cục bộa,bhoàn toàn không ảnh hưởng đến giá trị của hai biếnvar0vàvar1. Kiểu truyền tham số như vậy gọi là truyền tham trị (giá trị của biến được truyền vào). - Khi ta gọi hàm
swap_ptr(&var0, &var1);ta đã truyền vào địa chỉ của hai biếnvar0vàvar1(nhờ toán tử&), địa chỉ củavar0sẽ được copy và lưu vào biến cục bộa, địa chỉ củavar1sẽ được copy và lưu vào biến cục bộbcủa hàmvoid swap_ptr(int *a, int *b). Lúc nàya, blà hai biến con trỏ lưu địa chỉ của hai biếnvar0vàvar1. Kiểu truyền tham số này gọi là truyền tham chiếu (không phải truyền giá trị của biến mà truyền một địa chỉ để tham chiếu tới biến).int temp = *a;Biếntempđược khởi tạo và lưu giá trị chứa ở địa chỉ lưu trong biếna(chính là giá trị của biếnvar0).*a = *b;Giá trị ở ô nhớ có địa chỉ làb(var1)được copy qua ô nhớ có địa chỉ làa(var0).*b = temp;Giá trịtempđược lưu vào ô nhớ có địa chỉ làb(var1).
Bài tiếp: [C] Variable Pointer (Con trỏ biến) - P2