Professional Documents
Culture Documents
LÝ THUYẾT
CON TRỎ
1 28tech.com.vn
28TECH
Become A Better Developer
Con trỏ trong ngôn ngữ lập trình C được coi là một phần mạnh mẽ và
tương đối khó khi sử dụng.
2 28tech.com.vn
28TECH
Become A Better Developer
Ví dụ:
#include <stdio.h>
int main(){
int x; // biến int
int *a; // biến con trỏ kiểu int
double* b; // biến con trỏ kiểu double
char* c; // biến con trỏ kiểu char
}
3 28tech.com.vn
28TECH
Become A Better Developer
3. Gán giá trị cho con trỏ, toán tử địa chỉ và toán tử giải tham chiếu:
Toán tử địa chỉ & : Trả về địa chỉ của một biến trong bộ nhớ.
Toán tử giải tham chiếu * : Trả về giá trị của biến mà con trỏ
đang tham chiếu tới.
4 28tech.com.vn
28TECH
Become A Better Developer
3. Gán giá trị cho con trỏ, toán tử địa chỉ và toán tử giải tham chiếu:
Ví giá trị của con trỏ là một địa chỉ của biến khác, nên khi không khởi
tạo giá trị cho con trỏ thì nó được gọi là con trỏ NULL, còn khi gán địa
chỉ của 1 biến nào đó cho con trỏ thì ta nói con trỏ đang quản lý hoặc
trỏ tới biến đó.
#include <stdio.h>
OUTPUT
int main(){ 6487580
int a = 100;
int *ptr; // đang là con trỏ NULL 100
printf("%d\n", &a); // địa chỉ của biến a
ptr = &a; // cho ptr trỏ tới a
printf("%d\n", *ptr); // giải tham chiếu để truy cập a thông qua ptr
}
5 28tech.com.vn
28TECH
Become A Better Developer
3. Gán giá trị cho con trỏ, toán tử địa chỉ và toán tử giải tham chiếu:
Sau khi cho con trỏ quản lý 1 biến thì ta có thể thông qua toán tử giải
tham chiếu để thay đổi giá trị của biến mà con trỏ đang quản lý.
Trong ví dụ dưới việc bạn sử dụng a hay *ptr có ý nghĩa như nhau.
#include <stdio.h>
OUTPUT
int main(){ Gia tri cua bien ma ptr quan ly :100
int a = 100; Gia tri cua bien a :500
int *ptr; // đang là con trỏ NULL
ptr = &a; // cho ptr trỏ tới a
printf("Gia tri cua bien ma ptr quan ly : %d\n", *ptr);
*ptr = 500; // thay đổi luôn giá trị của a
printf("Gia tri cua bien a : %d\n", a);
}
6 28tech.com.vn
28TECH
Become A Better Developer
3. Gán giá trị cho con trỏ, toán tử địa chỉ và toán tử giải tham chiếu:
Cần phân biệt rõ 2 dấu *
Khi khai báo kiểu con trỏ, Dấu * trước tên con trỏ ở
ta thêm dấu * trước tên những câu lệnh sau câu
biến để chỉ ra rằng đây là lệnh khai báo là toán tử
biến con trỏ. giải tham chiếu.
int *ptr; *ptr = ...;
7 28tech.com.vn
28TECH
Become A Better Developer
8 28tech.com.vn
28TECH
Become A Better Developer
int main(){
Thực chất thì mảng là một hằng con trỏ, bạn có int a[] = {1, 2, 3, 4, 5};
thể in ra giá trị của mảng, khi đó giá trị của printf("%d\n", a);
mảng chính là địa chỉ của phần tử đầu tiên for(int i = 0; i < 5; i++){
trong mảng. printf("%d ", &a[i]);
}
printf("\n");
int a = {1, 2, 3, 4, 5}; for(int i = 0; i < 5; i++){
printf("%d ", (a + i));
}
a 1 2 3 4 5 } OUTPUT
6487536
Con trỏ a a+1 a+2 a+3 a+4 6487536 6487540 6487544 6487548 6487552
6487536 6487540 6487544 6487548 6487552
9 28tech.com.vn
28TECH
Become A Better Developer
int main(){
int n; scanf("%d", &n);
Có thể thao tác với mảng thông qua int a[n];
con trỏ. for(int i = 0; i < n; i++){
scanf("%d", (a + i));
}
for(int i = 0; i < n; i++){
printf("%d ", *(a + i));
}
}
10 28tech.com.vn
28TECH
Become A Better Developer
Sau khi cho một con trỏ trỏ vào phần int main(){
int n; scanf("%d", &n);
tử đầu tiên trong mảng, bạn có thể sử int a[n];
dụng con trỏ này như mảng. int *b = a;
for(int i = 0; i < n; i++){
scanf("%d", b + i);
}
for(int i = 0; i < n; i++){
printf("%d ", *(b + i));
}
}
11 28tech.com.vn
28TECH
Become A Better Developer
#include <stdio.h>
int main(){
Con trỏ và toán tử: int a[] = {1, 2, 4, 5, 6, 9, 8, 7};
int *ptr = a;
Khi con trỏ quản lý một mảng, các bạn ++ptr;
có thể dùng các toán tử như ++, --, +, - printf("%d\n", *ptr);
for(int *x = a; x != (a + 8); ++x){
để di chuyển con trỏ tới vị trí mong
printf("%d ", *x);
muốn trong mảng. }
} OUTPUT
2
123456789
12 28tech.com.vn