Con trỏ trong lập trình C++ (Phần 1)
Giới thiệu:
Con trỏ là một khái niệm trừu tượng và thông dụng trong lập trình C++, có thể so sánh vui là "Đẳng cấp" của lập trình viên C++ được đánh giá vào độ thuần thục sử dụng con trỏ.
Đối tượng hướng đến:
các bạn đang học lập trình C++ , cần tìm hiểu về con trỏ, các đối tượng khác có thể tham khảo thêm
Nội dung:
a)con trỏ là gì:
Đầu tiên các bạn cần hiểu rằng con trỏ cũng là một biến, nhưng biến này khác biến thông thường, ví dụ, biến kiểu int thì lưu trữ số nguyên, biến kiểu char thì lưu trữ ký tự, biến kiểu float thì lưu giữ số thực,...và biến con trỏ thì lưu giữ "địa chỉ".
Câu hỏi đặt ra ở đây là địa chỉ là địa chỉ của cái gì??? xin trả lời địa chỉ là địa chỉ...của một đối tượng nào đó trên thanh RAM.
để dễ hiểu thì mình nói sơ qua các kiến thức cũ. ví dụ trong hàm main, nếu bạn khai báo int a thì trên thanh RAM sẽ dành ra cho bạn một khoảng trống có kích thước 4 byte để lưu trữ biến a này, tương tự với biến char, double,short lần lượt là 1 byte, 8 byte và 2 byte, và việc cấp phát này hoàn toàn là ngấu nhiên (random), do hệ thống quyết định, và ứng với mỗi vùng nhớ được cấp phát như vậy sẽ có một địa chỉ tương ứng được đánh dấu, dạng 0xABC gì gì đó. Vậy nếu muốn biết địa chỉ biến đó thì làm thế nào? Bạn chỉ cẩn dùng câu lệnh cout<<&teenbien là ok, ví dụ nhá:
int a=9;
cout<<&a;
ta được kết quả chạy ra màn hình là 0x123ddf90 (dạng như vậy)
Rồi, quay lại vấn đề con trỏ, lúc trước mình có đề cập con trỏ là một biến dùng để lưu trữ địa chỉ, thì những địa chỉ mà mình vừa nói bên trên là cái mà con trỏ cần lưu (địa chỉ trên thanh RAM), vậy làm gì với nó bây giờ?
Để đơn giản và dễ hiểu, hãy tập làm quen với thao tác này trước đã:
Khai báo con trỏ, con trỏ nó cũng có kiểu của nó, mới học thì nghe có vẻ rắc rối đây, nhưng hãy nghĩ lại xem nhé, mình muốn có biến tên là a kiểu int thì mình khai báo int a, mình muốn có biến tên là c kiểu char thì mình khai báo char c, mình muốn có biến tên f kiểu float thì mình khai báo float f,...vậy thì muốn khai báo "con trỏ " thì tương tự nhưng thêm dấu * vào sau kiểu của nó, ví dụ:
trong đoạn lệnh trên, hệ thống sẽ cấp phát cho pointer 4 byte trên RAM, poiter sẽ lưu giữ giá trị là địa chỉ của biến a,, để kiểm chứng các bạn có thể cout<<&a; (xuất địa chỉ của a) và kèm theo đó là cout<<pointer; (xuất ra địa chỉ của pointer đang lưu giữ),
cho dù trái đất có sập đi nữa thì hai kết quả này luôn luôn bằng nhau, cam đoan với các bạn là như vậy, khỏi cần kiểm chứng 😀😀😀😀😀
rồi làm gì với nó bây giờ??? tất nhiên là mới nhập môn nên có thể bạn chưa hiểu tác dụng phi thường của nó, bây giờ hãy thử thao tác với con trỏ poiter, thao tác này được coi là đầu tiên, đơn giản, thần thánh nhất để làm quen với con trỏ. Nếu bây giờ ai đó yêu cầu bạn khai báo biến int a =9; rồi bắt các bạn thay đổi a =99 nhưng không được viết hàm, không được dùng câu lệnh a=99; rất là "điên rồ" phải không nào, Nhưng...con trỏ có thể giúp bạn đấy. Thử nhé:

//=========================================//
đáp án là 99 nhé, thỏa mãn yêu cầu cái đề thần thánh đó rồi nhé.
giờ hãy xem đoan code kia nó hoạt động thế nào.
Đầu tiên câu lệnh int a=9;
trên thanh Ram sẽ dành ra 4byte để chứa một biến kiểu int (vì biến kiểu int cần 4 byte mà), trên vùng nhớ này chứa biến a và có nội dung là 9 (tạm hiểu thế đi)
sau đó là câu lệnh int *pointer=&a;, , thanh ram sẽ dành ra cho bạn 4byte để lưu trữ con trỏ này, và đồng thời gán cho con trỏ giá trị là địa chỉ của biến a, nói cách khoa học hơn, con trỏ bây giờ đang trỏ tới nơi chứa biến a.
tiếp theo là câu lệnh *pointer =99; , câu lệnh này có nghĩa là "hey con trỏ, hãy đi tới cái nơi mày đang lưu giữ, thay đối cái nơi mày đang giữ thành 99 cho tao" 😛😛😛😛, nói vậy cho dễ hiểu, thế là sau câu lệnh đó, tại ô nhớ đang chứa a, thay vì chứa số 9 thì giờ đã bị đổi thành 99(bị đổi bởi một thằng pointer), nó tương đương với câu lệnh a = 99, giờ để kiểm chứng thì bạn có thể cout<<a mà xem. 😄😄😄😄. Tương tự với các loại dữ liệu khác, thực hiện tương tự, thay vì kiểu int thì hãy thử thao tác với kiểu long, double, float nhé, lưu ý là đừng làm vậy với kiểu char , vì...char là kiểu dữ liệu củ chuối và rắc rối, thế thôi, ai muốn thử thì cứ thử.
Lời kết:
những kiến thức mình vừa chia sẻ đây chỉ là những kiến thức cơ bản nhất về con trỏ trong lập trình C++, sau này các bạn sẽ còn đụng chạm tới những thứ đau não hơn khi thao tác với mảng một chiều, hai chiểu, mảng cấp phát động, con trỏ đa cấp,...và để học tốt những thứ đó bạn cần phải biết được những thứ cơ bản mà mình vừa chia sẻ đã, các kiến thức nâng cao về con trỏ mình sẽ tổng hợp ở bài viết sau. GOOD LUCK!!!
Con trỏ là một khái niệm trừu tượng và thông dụng trong lập trình C++, có thể so sánh vui là "Đẳng cấp" của lập trình viên C++ được đánh giá vào độ thuần thục sử dụng con trỏ.
Đối tượng hướng đến:
các bạn đang học lập trình C++ , cần tìm hiểu về con trỏ, các đối tượng khác có thể tham khảo thêm
Nội dung:
a)con trỏ là gì:
Đầu tiên các bạn cần hiểu rằng con trỏ cũng là một biến, nhưng biến này khác biến thông thường, ví dụ, biến kiểu int thì lưu trữ số nguyên, biến kiểu char thì lưu trữ ký tự, biến kiểu float thì lưu giữ số thực,...và biến con trỏ thì lưu giữ "địa chỉ".
Câu hỏi đặt ra ở đây là địa chỉ là địa chỉ của cái gì??? xin trả lời địa chỉ là địa chỉ...của một đối tượng nào đó trên thanh RAM.
để dễ hiểu thì mình nói sơ qua các kiến thức cũ. ví dụ trong hàm main, nếu bạn khai báo int a thì trên thanh RAM sẽ dành ra cho bạn một khoảng trống có kích thước 4 byte để lưu trữ biến a này, tương tự với biến char, double,short lần lượt là 1 byte, 8 byte và 2 byte, và việc cấp phát này hoàn toàn là ngấu nhiên (random), do hệ thống quyết định, và ứng với mỗi vùng nhớ được cấp phát như vậy sẽ có một địa chỉ tương ứng được đánh dấu, dạng 0xABC gì gì đó. Vậy nếu muốn biết địa chỉ biến đó thì làm thế nào? Bạn chỉ cẩn dùng câu lệnh cout<<&teenbien là ok, ví dụ nhá:
int a=9;
cout<<&a;
ta được kết quả chạy ra màn hình là 0x123ddf90 (dạng như vậy)
Rồi, quay lại vấn đề con trỏ, lúc trước mình có đề cập con trỏ là một biến dùng để lưu trữ địa chỉ, thì những địa chỉ mà mình vừa nói bên trên là cái mà con trỏ cần lưu (địa chỉ trên thanh RAM), vậy làm gì với nó bây giờ?
Để đơn giản và dễ hiểu, hãy tập làm quen với thao tác này trước đã:
Khai báo con trỏ, con trỏ nó cũng có kiểu của nó, mới học thì nghe có vẻ rắc rối đây, nhưng hãy nghĩ lại xem nhé, mình muốn có biến tên là a kiểu int thì mình khai báo int a, mình muốn có biến tên là c kiểu char thì mình khai báo char c, mình muốn có biến tên f kiểu float thì mình khai báo float f,...vậy thì muốn khai báo "con trỏ " thì tương tự nhưng thêm dấu * vào sau kiểu của nó, ví dụ:
trong đoạn lệnh trên, hệ thống sẽ cấp phát cho pointer 4 byte trên RAM, poiter sẽ lưu giữ giá trị là địa chỉ của biến a,, để kiểm chứng các bạn có thể cout<<&a; (xuất địa chỉ của a) và kèm theo đó là cout<<pointer; (xuất ra địa chỉ của pointer đang lưu giữ),
cho dù trái đất có sập đi nữa thì hai kết quả này luôn luôn bằng nhau, cam đoan với các bạn là như vậy, khỏi cần kiểm chứng 😀😀😀😀😀
rồi làm gì với nó bây giờ??? tất nhiên là mới nhập môn nên có thể bạn chưa hiểu tác dụng phi thường của nó, bây giờ hãy thử thao tác với con trỏ poiter, thao tác này được coi là đầu tiên, đơn giản, thần thánh nhất để làm quen với con trỏ. Nếu bây giờ ai đó yêu cầu bạn khai báo biến int a =9; rồi bắt các bạn thay đổi a =99 nhưng không được viết hàm, không được dùng câu lệnh a=99; rất là "điên rồ" phải không nào, Nhưng...con trỏ có thể giúp bạn đấy. Thử nhé:
//=========================================//
đáp án là 99 nhé, thỏa mãn yêu cầu cái đề thần thánh đó rồi nhé.
giờ hãy xem đoan code kia nó hoạt động thế nào.
Đầu tiên câu lệnh int a=9;
trên thanh Ram sẽ dành ra 4byte để chứa một biến kiểu int (vì biến kiểu int cần 4 byte mà), trên vùng nhớ này chứa biến a và có nội dung là 9 (tạm hiểu thế đi)
sau đó là câu lệnh int *pointer=&a;, , thanh ram sẽ dành ra cho bạn 4byte để lưu trữ con trỏ này, và đồng thời gán cho con trỏ giá trị là địa chỉ của biến a, nói cách khoa học hơn, con trỏ bây giờ đang trỏ tới nơi chứa biến a.
tiếp theo là câu lệnh *pointer =99; , câu lệnh này có nghĩa là "hey con trỏ, hãy đi tới cái nơi mày đang lưu giữ, thay đối cái nơi mày đang giữ thành 99 cho tao" 😛😛😛😛, nói vậy cho dễ hiểu, thế là sau câu lệnh đó, tại ô nhớ đang chứa a, thay vì chứa số 9 thì giờ đã bị đổi thành 99(bị đổi bởi một thằng pointer), nó tương đương với câu lệnh a = 99, giờ để kiểm chứng thì bạn có thể cout<<a mà xem. 😄😄😄😄. Tương tự với các loại dữ liệu khác, thực hiện tương tự, thay vì kiểu int thì hãy thử thao tác với kiểu long, double, float nhé, lưu ý là đừng làm vậy với kiểu char , vì...char là kiểu dữ liệu củ chuối và rắc rối, thế thôi, ai muốn thử thì cứ thử.
Lời kết:
những kiến thức mình vừa chia sẻ đây chỉ là những kiến thức cơ bản nhất về con trỏ trong lập trình C++, sau này các bạn sẽ còn đụng chạm tới những thứ đau não hơn khi thao tác với mảng một chiều, hai chiểu, mảng cấp phát động, con trỏ đa cấp,...và để học tốt những thứ đó bạn cần phải biết được những thứ cơ bản mà mình vừa chia sẻ đã, các kiến thức nâng cao về con trỏ mình sẽ tổng hợp ở bài viết sau. GOOD LUCK!!!
Comments