ݺߣ

ݺߣShare a Scribd company logo
5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ
https://nguyenvanhieu.vn/con-tro-trong-c/ 1/8
Bài 63. Con trỏ trong C
Bài số 61 trong 69 bài của khóa học Học C Không Khó
Trong bài học này, Lập trình không khó sẽ hướng dẫn các bạn cách sử dụng con trỏ trong ngôn ngữ
lập trình C. Bài viết này sẽ giúp các bạn hiểu thế nào là con trỏ, các khái niệm cơ bản liên quan đến
con trỏ cũng như cách sử dụng con trỏ trong C. Con trỏ là phần kiến thức khá rộng, do đó bài viết
này sẽ hướng dẫn về con trỏ cơ bản; Các bài viết tiếp theo sẽ trình bày chi tiết hơn con trỏ khi làm
việc với mảng, cấp phát bộ nhớ và quản lý bộ nhớ,… Mình hi vọng loạt bài học về con trỏ trong C này
sẽ giúp các bạn tự tin hơn.
Con trỏ trong C là một loại biến đặc biệt mà giá trị của nó là địa chỉ của 1 biến khác.
Địa chỉ của biến trong C
Để hiểu và sử dụng được con trỏ trong C, trước tiên bạn cần hiểu về khái niệm địa chỉ ở trong C. Nếu
bạn nào theo dõi khóa học C bá đạo của mình từ đầu thì chắc đã thấy mình nhắc tới khái niệm này
rồi. Phần này ta sẽ làm rõ vấn đề này.
Bởi Nguyễn Văn Hiếu
NỘI DUNG BÀI VIẾT
1. Địa chỉ của biến trong C
2. Con trỏ trong C
2.1. Cách khai báo con trỏ
2.2. Gán giá trị cho con trỏ
3. Bản chất của con trỏ trong C
4. Các lỗi thường gặp khi làm việc với con trỏ
5. Tài liệu tham khảo

0
1

int number;
22
5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ
https://nguyenvanhieu.vn/con-tro-trong-c/ 2/8
Bạn hãy nhìn ví dụ trên, tại sao khi dùng hàm chúng ta cần truyền vào , còn hàm
ta lại không có dấu kia? Bởi vì nếu bạn muốn nhập giá trị cho biến, hàm cần biết
địa chỉ của biến đó ở trong bộ nhớ.
Mỗi biến mà bạn khai báo đều có địa chỉ riêng của nó và giá trị mà nó đang lưu trữ. Để xem được địa
chỉ của biến, bạn thêm dấu vào trước tên biến. Xem xét ví dụ dưới đây:
Kết quả khi chạy chương trình:
Chú ý:
Bạn có thể sẽ nhận được các địa chỉ khác nhau mỗi khi chạy code trên.
Để nhận giá trị địa chỉ là như ảnh ở đâu bài, bạn thay bằng là được.
Con trỏ trong C
Con trỏ là gì? Con trỏ trong C cũng chỉ là là biến, cũng có thể khai báo, khởi tạo và lưu trữ giá trị và
có địa chỉ của riêng nó. Nhưng biến con trỏ không lưu giá trị bình thường, nó là biến trỏ tới 1 địa chỉ
khác, tức mang giá trị là 1 địa chỉ.
Chúng ta cùng thống nhất 1 số khái niệm khi làm việc với con trỏ nhé:
scanf &number
printf & scanf
&
hexa %d %x
2
3
4
5
printf("nNhap number = ");
scanf("%d", &number);
printf("nnumber = %d", number);

0
1
2
3
4
5
6
7
8
9
10
11

#include <stdio.h>
int main()
{
int number = 5;
printf("Gia tri cua number = %d", number);

// truy xuất địa chỉ bằng cách thêm & trước tên biến
printf("nDia chi cua number = %d", &number);
return 0;
}

0
1
2
3

Gia tri cua number = 5
Dia chi cua number = 6487580

22

5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ
https://nguyenvanhieu.vn/con-tro-trong-c/ 3/8
Giá trị của con trỏ: địa chỉ mà con trỏ trỏ đến.
Địa chỉ của con trỏ: địa chỉ của bản thân biến con trỏ đó.
Giá trị của biến nơi con trỏ đang trỏ tới.
Địa chỉ của biến nơi con trỏ đang trỏ tới = giá trị của con trỏ.
Chính vì con trỏ mang địa chỉ, nó là 1 biến đặc biệt có thêm những quyền năng mà biến bình thường
không có. Nhờ việc nó mang địa chỉ, nó có thể trỏ lung tung trong bộ nhớ. Đây là 1 điểm mạnh nếu
ta khai thác tốt nhưng nếu quản lý không tốt thì lại là 1 tai hại.
Cách khai báo con trỏ
Con trỏ trong C cũng có thể khai báo giống như biến bình thường, tên biến là một định danh hợp lệ.
Cú pháp như sau:
Trong đó:
Kiểu dữ liệu có thể là: void, int, float, double,…
Dấu * trước tên biến là ký hiệu báo cho trình biên dịch biết ta đang khai báo con trỏ.
Gán giá trị cho con trỏ
Sau khi khai báo con trỏ, bạn cần khởi tạo giá trị cho nó. Nếu con trỏ được sử dụng mà không được
khởi tạo, giá trị của nó sẽ là giá trị rác, điều này sẽ làm chương trình của bạn chạy không đúng, thậm
chí là nguy hiểm nếu giá trị rác đó chẳng may lại chính là địa chỉ của 1 biến nào đó bạn đang dùng.
Hoặc bạn cũng có thể khai báo và khởi tạo đồng thời:
0
1
2

<kiểu dữ liệu> * <tên biến>

0
1
2
3
4
5
6

int *p_i; // khai báo con trỏ để trỏ tới biến kiểu nguyên
int *p, val; // khai báo con trỏ p kiểu int, biến val (không phải con trỏ) kiểu int
float *p_f; // khai báo con trỏ để trỏ tới biến kiểu thực
char *p_char; // khai báo con trỏ để trỏ tới biến kiểu ký tự
void *p_v; // con trỏ kiểu void (không kiểu)

0
1
2
3
4

int *p, value;
value = 5;
p = &value; // khởi tạo giá trị cho con trỏ p là địa chỉ của value

0
1

int value = 5;
22

5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ
https://nguyenvanhieu.vn/con-tro-trong-c/ 4/8
Lưu ý:
Con trỏ khi khai báo nên được khởi tạo giá trị ngay.
Con trỏ kiểu là loại biến con trỏ tổng quát, nó có thể nhận địa chỉ của biến bất kỳ ở bất cứ
kiểu dữ liệu nào.
Khởi tạo con trỏ bằng địa chỉ nếu chưa cần dùng theo cách sau: . Khi đó
con trỏ luôn có giá trị .
Bản chất của con trỏ trong C
Bạn sẽ hiểu rõ hơn các quyền năng của con trỏ trong phần này, cũng xem ví dụ dưới đây nào:
void
NULL int *p = NULL
NULL 0
2
3
int *p = &value; // khai báo con trỏ p và khởi tạo giá trị cho con trỏ là địa chỉ củ

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14

#include <stdio.h>
int main()
{
int number = 5;
float *p_int = &number;
}

// Ouput:
PS G:c_courcesday_63> g++ .Pointer.cpp
.Pointer.cpp: In function 'int main()':
.Pointer.cpp:5:19: error: cannot convert 'int*' to 'float*' in initialization
 float *p_int = &number;
 ^

0
1
2
3
4
5
6
7
8
9

#include <stdio.h>
int main()
{
void *p_int = NULL;
printf("Gia tri cua con tro la %d", p_int);
}
// Output
// Gia tri cua con tro la 0

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#include <stdio.h>
int main()
{
// Khai báo + khởi tạo biến value = 10
int value = 10;

// Lấy giá trị của biến value
printf("nGia tri cua `value` = %d", value);
// Lấy địa chỉ của biến value
printf("nDia tri cua `value` = %d", &value);

printf("n-------------------n");

/*
Khai báo + khởi tạo biến con trỏ p
có giá trị là địa chỉ của biến value
*/
22

5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ
https://nguyenvanhieu.vn/con-tro-trong-c/ 5/8
Kết quả chạy:
Qua ví dụ này, bạn có thể thấy rõ sự đúng đắn của các kết luận sau đây về con trỏ:
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
int *p = &value;

// Lấy giá trị của con trỏ p
printf("nGia tri cua con tro `p` = %d", p);
// Lấy địa chỉ của con trỏ p
printf("nDia tri cua con tro `p` = %d", &p);
// Lấy giá trị của biến ma con trỏ p đang trỏ tới dùng toán tử *
printf("nGia tri cua bien ma con tro `p` dang tro toi = %d", *p);

printf("n-------------------n");

/*
Thay đổi giá trị của biến value thông qua con trỏ p
Giống như hàm scanf() có thể thay đổi giá trị của biến khi nhận vào địa chỉ,
con trỏ khi có địa chỉ của 1 biến hoàn toàn có thể thay đổi giá trị của
biến đó theo cách dưới đây:
*/
// Lấy giá trị của biến value
printf("nGia tri cua `value` = %d", value);
// Thay đổi giá trị của biến value thông qua `p`
*p = 100;
// Lấy giá trị của biến value
printf("nGia tri cua `value` = %d", value);
// Lấy giá trị của biến ma con trỏ p đang trỏ tới dùng toán tử *
printf("nGia tri cua bien ma con tro `p` dang tro toi = %d", *p);

printf("n-------------------n");

/*
Việc lấy giá trị của biến thông qua con trỏ
chỉ là 1 cách khác để lấy được giá trị của biến đó.

*/
value = 1000;
// Lấy giá trị của biến value
printf("nGia tri cua `value` = %d", value);
// Lấy giá trị của biến ma con trỏ p đang trỏ tới dùng toán tử *
printf("nGia tri cua bien ma con tro `p` dang tro toi = %d", *p);
}

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Gia tri cua `value` = 10
Dia tri cua `value` = 6487580
-------------------

Gia tri cua con tro `p` = 6487580
Dia tri cua con tro `p` = 6487568
Gia tri cua bien ma con tro `p` dang tro toi = 10
-------------------

Gia tri cua `value` = 10
Gia tri cua `value` = 100
Gia tri cua bien ma con tro `p` dang tro toi = 100
-------------------

Gia tri cua `value` = 1000
Gia tri cua bien ma con tro `p` dang tro toi = 1000

22

5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ
https://nguyenvanhieu.vn/con-tro-trong-c/ 6/8
Địa chỉ của biến chính là giá trị của con trỏ , đều là . Lưu ý mỗi lần chạy thì
giá trị địa chỉ này có thể khác nhau nhé.
Con trỏ có thể lấy giá trị của biến mà nó đang trỏ tới bằng toán tử :
p
Con trỏ có thể thay đổi giá trị của biến mà nó đang trỏ tới. Do nó mang địa chỉ của biến, khi đó nó
hoàn toàn có quyền thay đổi giá trị của biến đó. Như ở ví dụ trên ta thay đổi giá trị từ 10 lên 100.
Bài học hôm nay chúng ta sẽ chỉ dừng lại ở các kiến thức phía trên, các bài học sau chúng ta sẽ cùng
nhau đi tìm hiểu về mối liên hệ giữa con trỏ với mảng và con trỏ với hàm cũng như cách quản lý bộ
nhớ khi làm việc với con trỏ trong C.
Các lỗi thường gặp khi làm việc với con trỏ
Giả sử bạn muốn khởi tạo giá trị của con trỏ trỏ tới địa chỉ của biến , khi đó:
Các bạn khi mới học con trỏ sẽ mông lung về dấu ở phần khai báo và khi lấy giá trị của biến mà
con trỏ đang trỏ tới:
Tài liệu tham khảo
value p 6487580
* printf("nDia tri
cua con tro = %d", *p);
p value
*
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

int value, *p;

// Sai! p cần địa chỉ cơ,
// value không phải là cái địa chỉ đó.
p = value;

// Sai! *p là giá trị của biến mà con trỏ đang trỏ tới,
// &value là địa chỉ.
*p = &value;

// Đúng rồi! p cần 1 địa chỉ,
// &value là địa chỉ của biến value.
p = &value;

// Đúng! *p là giá trị của biến mà con trỏ đang trỏ tới, và
// c cũng là giá trị (không phải địa chỉ).
*p = value;

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#include <stdio.h>
int main()
{
int c = 5;
// Dấu * ở đây để chúng ta biết chúng ta đang khai báo con trỏ.
// Không phải lấy giá trị của nó nhé
int *p = &c;
// Khai báo trên tương đương
// int *p;
// p = &c;
// Nếu bạn muốn phân biệt 2 thằng này, khi khai báo có thể viết như sau:
// int* p = &c;

// Lấy giá chỉ của biến mà con trỏ đang trỏ tới, chính là giá trị của c
printf("%d", *p); // 5
}

22

5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ
https://nguyenvanhieu.vn/con-tro-trong-c/ 7/8
Bài trước: Bài 62. Bài tập chuỗi trong C có lời giải
Bài sau: Bài 64. Mối quan hệ giữa con trỏ và mảng
Mặc dù mình đã cố gắng trình bày tỉ mỉ, nhưng có thể còn thiếu sót. Dưới đây là 1 số tài liệu bạn nên
đọc thêm để hiểu hơn về con trỏ trong C:
1. Tìm hiểu bản chất của con trỏ từ cơ bản tới nâng cao
2. C Pointers (With Example)
Các bài viết trong khóa học
Nguyễn Văn Hiếu
Sáng lập cộng đồng Lập Trình Không Khó với mong muốn giúp đỡ các bạn trẻ trên con đường trở thành những lập
trình viên tương lai. Tất cả những gì tôi viết ra đây chỉ đơn giản là sở thích ghi lại các kiến thức mà tôi tích lũy được.
    
Lập Trình Không Khó là một cộng đồng chia sẻ và đào tạo lập trình phi lợi nhuận hàng đầu tại Việt Nam.
 Liên hệ hoặc Hợp tác & Quảng cáo
    
BÀI VIẾT HAY
22

5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ
https://nguyenvanhieu.vn/con-tro-trong-c/ 8/8
CHUYÊN MỤC HAY
193
47
45
37
26
23
22
22
Học C/C++
Học Python
Học Java
Học Javascript
Học Web
Bài tập Javascript
Machine learning
Chia sẻ
- BẠN BÈ & ĐỐI TÁC -
Tự Học Đồ Họa Cách Học Lập Trình VNTALKING
© 2018-2020. Bản quyền thuộc Lập Trình Không Khó. Privacy & Terms
Bài 1. Giới thiệu khóa học “Học C Bá Đạo”
21/07/2019
1000 bài tập lập trình C/C++ có lời giải của thầy Khang
25/12/2019
Kiểm tra số nguyên tố sử dụng C/C++ và Java
15/07/2018
22


More Related Content

What's hot (20)

Chương 5 & 6 Tương Quan Và Hồi Quy
Chương 5 & 6 Tương Quan Và Hồi QuyChương 5 & 6 Tương Quan Và Hồi Quy
Chương 5 & 6 Tương Quan Và Hồi Quy
Le Nguyen Truong Giang
Bai giang-toan-kinh-te-tin-hoc
Bai giang-toan-kinh-te-tin-hocBai giang-toan-kinh-te-tin-hoc
Bai giang-toan-kinh-te-tin-hoc
Lê Ngọc Huyền
LSHTKT Chủ nghĩa tự do mới
LSHTKT Chủ nghĩa tự do mớiLSHTKT Chủ nghĩa tự do mới
LSHTKT Chủ nghĩa tự do mới
Quy Moke
Bài 3 lựa chọn của người tiêu dùng và cầu thị trường
Bài 3  lựa chọn của người tiêu dùng và cầu thị trườngBài 3  lựa chọn của người tiêu dùng và cầu thị trường
Bài 3 lựa chọn của người tiêu dùng và cầu thị trường
Quyen Le
Kinh tế vi mô
Kinh tế vi môKinh tế vi mô
Kinh tế vi mô
ConNgiGiiTon
Nst giới tính và di truyền liên kết giới tính
Nst giới tính và di truyền liên kết giới tínhNst giới tính và di truyền liên kết giới tính
Nst giới tính và di truyền liên kết giới tính
Sophie Nguyen
Bài giảng xác suất thống kê
Bài giảng xác suất thống kêBài giảng xác suất thống kê
Bài giảng xác suất thống kê
Học Huỳnh Bá
Chuong4 PHÂN TÍCH PHƯƠNG SAI MỘT YẾU TỐ
Chuong4 PHÂN TÍCH PHƯƠNG SAI MỘT YẾU TỐChuong4 PHÂN TÍCH PHƯƠNG SAI MỘT YẾU TỐ
Chuong4 PHÂN TÍCH PHƯƠNG SAI MỘT YẾU TỐ
Thắng Nguyễn
Một số ứng dụng thống kê trong SPSS
Một số ứng dụng thống kê trong SPSSMột số ứng dụng thống kê trong SPSS
Một số ứng dụng thống kê trong SPSS
BeriDang
Bảng giá trị hàm Laplace
Bảng giá trị hàm LaplaceBảng giá trị hàm Laplace
Bảng giá trị hàm Laplace
hiendoanht
Bai giang hệ quản trị cơ sở dữ liệu
Bai giang hệ quản trị cơ sở dữ liệuBai giang hệ quản trị cơ sở dữ liệu
Bai giang hệ quản trị cơ sở dữ liệu
trinhvannam-90
ASSIGMENT DATN.pdf
ASSIGMENT DATN.pdfASSIGMENT DATN.pdf
ASSIGMENT DATN.pdf
Hạt Hạnh Phúc
Thu y c3. bệnh sán lá gan
Thu y   c3. bệnh sán lá ganThu y   c3. bệnh sán lá gan
Thu y c3. bệnh sán lá gan
SinhKy-HaNam
Phương pháp tổng hợp cân đối kế toán
Phương pháp tổng hợp cân đối kế toánPhương pháp tổng hợp cân đối kế toán
Phương pháp tổng hợp cân đối kế toán
Học Huỳnh Bá
Chuong2: ƯỚC LƯỢNG THAM SỐ, môn thống kê ứng dụng
Chuong2: ƯỚC LƯỢNG THAM SỐ, môn thống kê ứng dụngChuong2: ƯỚC LƯỢNG THAM SỐ, môn thống kê ứng dụng
Chuong2: ƯỚC LƯỢNG THAM SỐ, môn thống kê ứng dụng
Thắng Nguyễn
Chuong 9. sinh lý sinh sản www.mientayvn.com
Chuong 9. sinh lý sinh sản www.mientayvn.comChuong 9. sinh lý sinh sản www.mientayvn.com
Chuong 9. sinh lý sinh sản www.mientayvn.com
www. mientayvn.com
Kiểm định giả thuyết thống kê - Ths. Huỳnh Tú Uyên
Kiểm định giả thuyết thống kê - Ths. Huỳnh Tú UyênKiểm định giả thuyết thống kê - Ths. Huỳnh Tú Uyên
Kiểm định giả thuyết thống kê - Ths. Huỳnh Tú Uyên
Tài liệu sinh học
Công thức kinh tế lượng
Công thức kinh tế lượngCông thức kinh tế lượng
Công thức kinh tế lượng
dlmonline24h
LSHTKT Chủ nghĩa tự do mới
LSHTKT Chủ nghĩa tự do mớiLSHTKT Chủ nghĩa tự do mới
LSHTKT Chủ nghĩa tự do mới
Quy Moke
Bài 3 lựa chọn của người tiêu dùng và cầu thị trường
Bài 3  lựa chọn của người tiêu dùng và cầu thị trườngBài 3  lựa chọn của người tiêu dùng và cầu thị trường
Bài 3 lựa chọn của người tiêu dùng và cầu thị trường
Quyen Le
Nst giới tính và di truyền liên kết giới tính
Nst giới tính và di truyền liên kết giới tínhNst giới tính và di truyền liên kết giới tính
Nst giới tính và di truyền liên kết giới tính
Sophie Nguyen
Bài giảng xác suất thống kê
Bài giảng xác suất thống kêBài giảng xác suất thống kê
Bài giảng xác suất thống kê
Học Huỳnh Bá
Chuong4 PHÂN TÍCH PHƯƠNG SAI MỘT YẾU TỐ
Chuong4 PHÂN TÍCH PHƯƠNG SAI MỘT YẾU TỐChuong4 PHÂN TÍCH PHƯƠNG SAI MỘT YẾU TỐ
Chuong4 PHÂN TÍCH PHƯƠNG SAI MỘT YẾU TỐ
Thắng Nguyễn
Một số ứng dụng thống kê trong SPSS
Một số ứng dụng thống kê trong SPSSMột số ứng dụng thống kê trong SPSS
Một số ứng dụng thống kê trong SPSS
BeriDang
Bảng giá trị hàm Laplace
Bảng giá trị hàm LaplaceBảng giá trị hàm Laplace
Bảng giá trị hàm Laplace
hiendoanht
Bai giang hệ quản trị cơ sở dữ liệu
Bai giang hệ quản trị cơ sở dữ liệuBai giang hệ quản trị cơ sở dữ liệu
Bai giang hệ quản trị cơ sở dữ liệu
trinhvannam-90
Thu y c3. bệnh sán lá gan
Thu y   c3. bệnh sán lá ganThu y   c3. bệnh sán lá gan
Thu y c3. bệnh sán lá gan
SinhKy-HaNam
Phương pháp tổng hợp cân đối kế toán
Phương pháp tổng hợp cân đối kế toánPhương pháp tổng hợp cân đối kế toán
Phương pháp tổng hợp cân đối kế toán
Học Huỳnh Bá
Chuong2: ƯỚC LƯỢNG THAM SỐ, môn thống kê ứng dụng
Chuong2: ƯỚC LƯỢNG THAM SỐ, môn thống kê ứng dụngChuong2: ƯỚC LƯỢNG THAM SỐ, môn thống kê ứng dụng
Chuong2: ƯỚC LƯỢNG THAM SỐ, môn thống kê ứng dụng
Thắng Nguyễn
Chuong 9. sinh lý sinh sản www.mientayvn.com
Chuong 9. sinh lý sinh sản www.mientayvn.comChuong 9. sinh lý sinh sản www.mientayvn.com
Chuong 9. sinh lý sinh sản www.mientayvn.com
www. mientayvn.com
Kiểm định giả thuyết thống kê - Ths. Huỳnh Tú Uyên
Kiểm định giả thuyết thống kê - Ths. Huỳnh Tú UyênKiểm định giả thuyết thống kê - Ths. Huỳnh Tú Uyên
Kiểm định giả thuyết thống kê - Ths. Huỳnh Tú Uyên
Tài liệu sinh học
Công thức kinh tế lượng
Công thức kinh tế lượngCông thức kinh tế lượng
Công thức kinh tế lượng
dlmonline24h

Similar to Con trỏ trong C (20)

Giới thiệu ngôn ngữ lập trình C++
Giới thiệu ngôn ngữ lập trình C++Giới thiệu ngôn ngữ lập trình C++
Giới thiệu ngôn ngữ lập trình C++
LAnhHuy4
LAP TRINH C - SESSION 2
LAP TRINH C - SESSION 2LAP TRINH C - SESSION 2
LAP TRINH C - SESSION 2
pnanhvn
Giao trinh thiet ke web bai 4 - php
Giao trinh thiet ke web   bai 4 - phpGiao trinh thiet ke web   bai 4 - php
Giao trinh thiet ke web bai 4 - php
cashdeptrai
Bài 3_ Pointer.docxfasssssssdsadsadsadsadsa
Bài 3_ Pointer.docxfasssssssdsadsadsadsadsaBài 3_ Pointer.docxfasssssssdsadsadsadsadsa
Bài 3_ Pointer.docxfasssssssdsadsadsadsadsa
nguyenvanthanh76bk
Pointer
PointerPointer
Pointer
Phi Tường
3 Function
3 Function3 Function
3 Function
Cuong
[hoctap.suctremmt.com]Chuong 01 - Cac dac diem moi cua C++.pptx
[hoctap.suctremmt.com]Chuong 01 - Cac dac diem moi cua C++.pptx[hoctap.suctremmt.com]Chuong 01 - Cac dac diem moi cua C++.pptx
[hoctap.suctremmt.com]Chuong 01 - Cac dac diem moi cua C++.pptx
tanguyenduynhatvien
3 Function
3 Function3 Function
3 Function
Cuong
Pointer vn
Pointer vnPointer vn
Pointer vn
Harry Potter
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Thanh Giảng Lê
Tai lieu huong_dan_ve_lap_trinh_php_7512
Tai lieu huong_dan_ve_lap_trinh_php_7512Tai lieu huong_dan_ve_lap_trinh_php_7512
Tai lieu huong_dan_ve_lap_trinh_php_7512
lekytho
Thdc3 Lap Trinh C
Thdc3 Lap Trinh CThdc3 Lap Trinh C
Thdc3 Lap Trinh C
quyloc
ݺߣ pointer sepro
ݺߣ pointer seproݺߣ pointer sepro
ݺߣ pointer sepro
Anh Lê Ngọc
Cac ham trong C# - 2555555555555555555555
Cac ham trong C# - 2555555555555555555555Cac ham trong C# - 2555555555555555555555
Cac ham trong C# - 2555555555555555555555
YnGiangNguyn
Giới thiệu ngôn ngữ lập trình C++
Giới thiệu ngôn ngữ lập trình C++Giới thiệu ngôn ngữ lập trình C++
Giới thiệu ngôn ngữ lập trình C++
LAnhHuy4
LAP TRINH C - SESSION 2
LAP TRINH C - SESSION 2LAP TRINH C - SESSION 2
LAP TRINH C - SESSION 2
pnanhvn
Giao trinh thiet ke web bai 4 - php
Giao trinh thiet ke web   bai 4 - phpGiao trinh thiet ke web   bai 4 - php
Giao trinh thiet ke web bai 4 - php
cashdeptrai
Bài 3_ Pointer.docxfasssssssdsadsadsadsadsa
Bài 3_ Pointer.docxfasssssssdsadsadsadsadsaBài 3_ Pointer.docxfasssssssdsadsadsadsadsa
Bài 3_ Pointer.docxfasssssssdsadsadsadsadsa
nguyenvanthanh76bk
3 Function
3 Function3 Function
3 Function
Cuong
[hoctap.suctremmt.com]Chuong 01 - Cac dac diem moi cua C++.pptx
[hoctap.suctremmt.com]Chuong 01 - Cac dac diem moi cua C++.pptx[hoctap.suctremmt.com]Chuong 01 - Cac dac diem moi cua C++.pptx
[hoctap.suctremmt.com]Chuong 01 - Cac dac diem moi cua C++.pptx
tanguyenduynhatvien
3 Function
3 Function3 Function
3 Function
Cuong
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Thanh Giảng Lê
Tai lieu huong_dan_ve_lap_trinh_php_7512
Tai lieu huong_dan_ve_lap_trinh_php_7512Tai lieu huong_dan_ve_lap_trinh_php_7512
Tai lieu huong_dan_ve_lap_trinh_php_7512
lekytho
Thdc3 Lap Trinh C
Thdc3 Lap Trinh CThdc3 Lap Trinh C
Thdc3 Lap Trinh C
quyloc
Cac ham trong C# - 2555555555555555555555
Cac ham trong C# - 2555555555555555555555Cac ham trong C# - 2555555555555555555555
Cac ham trong C# - 2555555555555555555555
YnGiangNguyn

Con trỏ trong C

  • 1. 5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ https://nguyenvanhieu.vn/con-tro-trong-c/ 1/8 Bài 63. Con trỏ trong C Bài số 61 trong 69 bài của khóa học Học C Không Khó Trong bài học này, Lập trình không khó sẽ hướng dẫn các bạn cách sử dụng con trỏ trong ngôn ngữ lập trình C. Bài viết này sẽ giúp các bạn hiểu thế nào là con trỏ, các khái niệm cơ bản liên quan đến con trỏ cũng như cách sử dụng con trỏ trong C. Con trỏ là phần kiến thức khá rộng, do đó bài viết này sẽ hướng dẫn về con trỏ cơ bản; Các bài viết tiếp theo sẽ trình bày chi tiết hơn con trỏ khi làm việc với mảng, cấp phát bộ nhớ và quản lý bộ nhớ,… Mình hi vọng loạt bài học về con trỏ trong C này sẽ giúp các bạn tự tin hơn. Con trỏ trong C là một loại biến đặc biệt mà giá trị của nó là địa chỉ của 1 biến khác. Địa chỉ của biến trong C Để hiểu và sử dụng được con trỏ trong C, trước tiên bạn cần hiểu về khái niệm địa chỉ ở trong C. Nếu bạn nào theo dõi khóa học C bá đạo của mình từ đầu thì chắc đã thấy mình nhắc tới khái niệm này rồi. Phần này ta sẽ làm rõ vấn đề này. Bởi Nguyễn Văn Hiếu NỘI DUNG BÀI VIẾT 1. Địa chỉ của biến trong C 2. Con trỏ trong C 2.1. Cách khai báo con trỏ 2.2. Gán giá trị cho con trỏ 3. Bản chất của con trỏ trong C 4. Các lỗi thường gặp khi làm việc với con trỏ 5. Tài liệu tham khảo  0 1 int number; 22
  • 2. 5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ https://nguyenvanhieu.vn/con-tro-trong-c/ 2/8 Bạn hãy nhìn ví dụ trên, tại sao khi dùng hàm chúng ta cần truyền vào , còn hàm ta lại không có dấu kia? Bởi vì nếu bạn muốn nhập giá trị cho biến, hàm cần biết địa chỉ của biến đó ở trong bộ nhớ. Mỗi biến mà bạn khai báo đều có địa chỉ riêng của nó và giá trị mà nó đang lưu trữ. Để xem được địa chỉ của biến, bạn thêm dấu vào trước tên biến. Xem xét ví dụ dưới đây: Kết quả khi chạy chương trình: Chú ý: Bạn có thể sẽ nhận được các địa chỉ khác nhau mỗi khi chạy code trên. Để nhận giá trị địa chỉ là như ảnh ở đâu bài, bạn thay bằng là được. Con trỏ trong C Con trỏ là gì? Con trỏ trong C cũng chỉ là là biến, cũng có thể khai báo, khởi tạo và lưu trữ giá trị và có địa chỉ của riêng nó. Nhưng biến con trỏ không lưu giá trị bình thường, nó là biến trỏ tới 1 địa chỉ khác, tức mang giá trị là 1 địa chỉ. Chúng ta cùng thống nhất 1 số khái niệm khi làm việc với con trỏ nhé: scanf &number printf & scanf & hexa %d %x 2 3 4 5 printf("nNhap number = "); scanf("%d", &number); printf("nnumber = %d", number); 0 1 2 3 4 5 6 7 8 9 10 11 #include <stdio.h> int main() { int number = 5; printf("Gia tri cua number = %d", number); // truy xuất địa chỉ bằng cách thêm & trước tên biến printf("nDia chi cua number = %d", &number); return 0; } 0 1 2 3 Gia tri cua number = 5 Dia chi cua number = 6487580 22 
  • 3. 5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ https://nguyenvanhieu.vn/con-tro-trong-c/ 3/8 Giá trị của con trỏ: địa chỉ mà con trỏ trỏ đến. Địa chỉ của con trỏ: địa chỉ của bản thân biến con trỏ đó. Giá trị của biến nơi con trỏ đang trỏ tới. Địa chỉ của biến nơi con trỏ đang trỏ tới = giá trị của con trỏ. Chính vì con trỏ mang địa chỉ, nó là 1 biến đặc biệt có thêm những quyền năng mà biến bình thường không có. Nhờ việc nó mang địa chỉ, nó có thể trỏ lung tung trong bộ nhớ. Đây là 1 điểm mạnh nếu ta khai thác tốt nhưng nếu quản lý không tốt thì lại là 1 tai hại. Cách khai báo con trỏ Con trỏ trong C cũng có thể khai báo giống như biến bình thường, tên biến là một định danh hợp lệ. Cú pháp như sau: Trong đó: Kiểu dữ liệu có thể là: void, int, float, double,… Dấu * trước tên biến là ký hiệu báo cho trình biên dịch biết ta đang khai báo con trỏ. Gán giá trị cho con trỏ Sau khi khai báo con trỏ, bạn cần khởi tạo giá trị cho nó. Nếu con trỏ được sử dụng mà không được khởi tạo, giá trị của nó sẽ là giá trị rác, điều này sẽ làm chương trình của bạn chạy không đúng, thậm chí là nguy hiểm nếu giá trị rác đó chẳng may lại chính là địa chỉ của 1 biến nào đó bạn đang dùng. Hoặc bạn cũng có thể khai báo và khởi tạo đồng thời: 0 1 2 <kiểu dữ liệu> * <tên biến> 0 1 2 3 4 5 6 int *p_i; // khai báo con trỏ để trỏ tới biến kiểu nguyên int *p, val; // khai báo con trỏ p kiểu int, biến val (không phải con trỏ) kiểu int float *p_f; // khai báo con trỏ để trỏ tới biến kiểu thực char *p_char; // khai báo con trỏ để trỏ tới biến kiểu ký tự void *p_v; // con trỏ kiểu void (không kiểu) 0 1 2 3 4 int *p, value; value = 5; p = &value; // khởi tạo giá trị cho con trỏ p là địa chỉ của value 0 1 int value = 5; 22 
  • 4. 5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ https://nguyenvanhieu.vn/con-tro-trong-c/ 4/8 Lưu ý: Con trỏ khi khai báo nên được khởi tạo giá trị ngay. Con trỏ kiểu là loại biến con trỏ tổng quát, nó có thể nhận địa chỉ của biến bất kỳ ở bất cứ kiểu dữ liệu nào. Khởi tạo con trỏ bằng địa chỉ nếu chưa cần dùng theo cách sau: . Khi đó con trỏ luôn có giá trị . Bản chất của con trỏ trong C Bạn sẽ hiểu rõ hơn các quyền năng của con trỏ trong phần này, cũng xem ví dụ dưới đây nào: void NULL int *p = NULL NULL 0 2 3 int *p = &value; // khai báo con trỏ p và khởi tạo giá trị cho con trỏ là địa chỉ củ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h> int main() { int number = 5; float *p_int = &number; } // Ouput: PS G:c_courcesday_63> g++ .Pointer.cpp .Pointer.cpp: In function 'int main()': .Pointer.cpp:5:19: error: cannot convert 'int*' to 'float*' in initialization float *p_int = &number; ^ 0 1 2 3 4 5 6 7 8 9 #include <stdio.h> int main() { void *p_int = NULL; printf("Gia tri cua con tro la %d", p_int); } // Output // Gia tri cua con tro la 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h> int main() { // Khai báo + khởi tạo biến value = 10 int value = 10; // Lấy giá trị của biến value printf("nGia tri cua `value` = %d", value); // Lấy địa chỉ của biến value printf("nDia tri cua `value` = %d", &value); printf("n-------------------n"); /* Khai báo + khởi tạo biến con trỏ p có giá trị là địa chỉ của biến value */ 22 
  • 5. 5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ https://nguyenvanhieu.vn/con-tro-trong-c/ 5/8 Kết quả chạy: Qua ví dụ này, bạn có thể thấy rõ sự đúng đắn của các kết luận sau đây về con trỏ: 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 int *p = &value; // Lấy giá trị của con trỏ p printf("nGia tri cua con tro `p` = %d", p); // Lấy địa chỉ của con trỏ p printf("nDia tri cua con tro `p` = %d", &p); // Lấy giá trị của biến ma con trỏ p đang trỏ tới dùng toán tử * printf("nGia tri cua bien ma con tro `p` dang tro toi = %d", *p); printf("n-------------------n"); /* Thay đổi giá trị của biến value thông qua con trỏ p Giống như hàm scanf() có thể thay đổi giá trị của biến khi nhận vào địa chỉ, con trỏ khi có địa chỉ của 1 biến hoàn toàn có thể thay đổi giá trị của biến đó theo cách dưới đây: */ // Lấy giá trị của biến value printf("nGia tri cua `value` = %d", value); // Thay đổi giá trị của biến value thông qua `p` *p = 100; // Lấy giá trị của biến value printf("nGia tri cua `value` = %d", value); // Lấy giá trị của biến ma con trỏ p đang trỏ tới dùng toán tử * printf("nGia tri cua bien ma con tro `p` dang tro toi = %d", *p); printf("n-------------------n"); /* Việc lấy giá trị của biến thông qua con trỏ chỉ là 1 cách khác để lấy được giá trị của biến đó. */ value = 1000; // Lấy giá trị của biến value printf("nGia tri cua `value` = %d", value); // Lấy giá trị của biến ma con trỏ p đang trỏ tới dùng toán tử * printf("nGia tri cua bien ma con tro `p` dang tro toi = %d", *p); } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Gia tri cua `value` = 10 Dia tri cua `value` = 6487580 ------------------- Gia tri cua con tro `p` = 6487580 Dia tri cua con tro `p` = 6487568 Gia tri cua bien ma con tro `p` dang tro toi = 10 ------------------- Gia tri cua `value` = 10 Gia tri cua `value` = 100 Gia tri cua bien ma con tro `p` dang tro toi = 100 ------------------- Gia tri cua `value` = 1000 Gia tri cua bien ma con tro `p` dang tro toi = 1000 22 
  • 6. 5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ https://nguyenvanhieu.vn/con-tro-trong-c/ 6/8 Địa chỉ của biến chính là giá trị của con trỏ , đều là . Lưu ý mỗi lần chạy thì giá trị địa chỉ này có thể khác nhau nhé. Con trỏ có thể lấy giá trị của biến mà nó đang trỏ tới bằng toán tử : p Con trỏ có thể thay đổi giá trị của biến mà nó đang trỏ tới. Do nó mang địa chỉ của biến, khi đó nó hoàn toàn có quyền thay đổi giá trị của biến đó. Như ở ví dụ trên ta thay đổi giá trị từ 10 lên 100. Bài học hôm nay chúng ta sẽ chỉ dừng lại ở các kiến thức phía trên, các bài học sau chúng ta sẽ cùng nhau đi tìm hiểu về mối liên hệ giữa con trỏ với mảng và con trỏ với hàm cũng như cách quản lý bộ nhớ khi làm việc với con trỏ trong C. Các lỗi thường gặp khi làm việc với con trỏ Giả sử bạn muốn khởi tạo giá trị của con trỏ trỏ tới địa chỉ của biến , khi đó: Các bạn khi mới học con trỏ sẽ mông lung về dấu ở phần khai báo và khi lấy giá trị của biến mà con trỏ đang trỏ tới: Tài liệu tham khảo value p 6487580 * printf("nDia tri cua con tro = %d", *p); p value * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 int value, *p; // Sai! p cần địa chỉ cơ, // value không phải là cái địa chỉ đó. p = value; // Sai! *p là giá trị của biến mà con trỏ đang trỏ tới, // &value là địa chỉ. *p = &value; // Đúng rồi! p cần 1 địa chỉ, // &value là địa chỉ của biến value. p = &value; // Đúng! *p là giá trị của biến mà con trỏ đang trỏ tới, và // c cũng là giá trị (không phải địa chỉ). *p = value; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h> int main() { int c = 5; // Dấu * ở đây để chúng ta biết chúng ta đang khai báo con trỏ. // Không phải lấy giá trị của nó nhé int *p = &c; // Khai báo trên tương đương // int *p; // p = &c; // Nếu bạn muốn phân biệt 2 thằng này, khi khai báo có thể viết như sau: // int* p = &c; // Lấy giá chỉ của biến mà con trỏ đang trỏ tới, chính là giá trị của c printf("%d", *p); // 5 } 22 
  • 7. 5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ https://nguyenvanhieu.vn/con-tro-trong-c/ 7/8 Bài trước: Bài 62. Bài tập chuỗi trong C có lời giải Bài sau: Bài 64. Mối quan hệ giữa con trỏ và mảng Mặc dù mình đã cố gắng trình bày tỉ mỉ, nhưng có thể còn thiếu sót. Dưới đây là 1 số tài liệu bạn nên đọc thêm để hiểu hơn về con trỏ trong C: 1. Tìm hiểu bản chất của con trỏ từ cơ bản tới nâng cao 2. C Pointers (With Example) Các bài viết trong khóa học Nguyễn Văn Hiếu Sáng lập cộng đồng Lập Trình Không Khó với mong muốn giúp đỡ các bạn trẻ trên con đường trở thành những lập trình viên tương lai. Tất cả những gì tôi viết ra đây chỉ đơn giản là sở thích ghi lại các kiến thức mà tôi tích lũy được.      Lập Trình Không Khó là một cộng đồng chia sẻ và đào tạo lập trình phi lợi nhuận hàng đầu tại Việt Nam.  Liên hệ hoặc Hợp tác & Quảng cáo      BÀI VIẾT HAY 22 
  • 8. 5/4/2021 Con trỏ trong C | Hiểu rõ 100% bản chất của con trỏ https://nguyenvanhieu.vn/con-tro-trong-c/ 8/8 CHUYÊN MỤC HAY 193 47 45 37 26 23 22 22 Học C/C++ Học Python Học Java Học Javascript Học Web Bài tập Javascript Machine learning Chia sẻ - BẠN BÈ & ĐỐI TÁC - Tự Học Đồ Họa Cách Học Lập Trình VNTALKING © 2018-2020. Bản quyền thuộc Lập Trình Không Khó. Privacy & Terms Bài 1. Giới thiệu khóa học “Học C Bá Đạo” 21/07/2019 1000 bài tập lập trình C/C++ có lời giải của thầy Khang 25/12/2019 Kiểm tra số nguyên tố sử dụng C/C++ và Java 15/07/2018 22 