Xin chào, và chào mừng trở lại.
Chúng tôi đang ở trong một phần mới. Phần này được đặt tên là con trỏ.
Đây có lẽ là phần quan trọng nhất của khóa học.
Đây cũng có lẽ là phần khó nhất của khóa học. Khái niệm con trỏ
và c là một khái niệm phức tạp, lắt léo.
Nhưng chúng ta sẽ trải qua nó rất chậm.
Chúng tôi sẽ cung cấp rất nhiều bài giảng và đi từng bước một.
Chúng ta sẽ bắt đầu ở cấp độ cao nhất và đi vào ngày càng chi tiết hơn.
Bạn phải hiểu con trỏ nếu bạn muốn tận dụng tối đa
ngôn ngữ c. Vì vậy, nó rất quan trọng.
Vì vậy, chúng ta hãy bắt đầu ở phần trên và nói về khái niệm hướng dẫn này,
về cơ bản nó là khái niệm giống như một con trỏ.
Vì vậy, con trỏ rất giống với khái niệm hướng dẫn.
Bạn sử dụng tính định hướng trong cuộc sống hàng ngày của mình. Vì vậy, ví dụ, nếu tôi đang
mô tả sự chuyển hướng có nghĩa là gì, nó sẽ giống như
việc bạn phải mua một thứ gì đó mới, một sản phẩm mới tại công ty của bạn.
Ví dụ: giả sử bạn phải mua một hộp mực mới cho máy in của mình.
Nếu bạn đang làm việc tại một công ty lớn, điều bạn có thể làm
là bạn sẽ phải đi qua một bộ phận nào đó
để mua bất kỳ món hàng mới nào. Vì vậy, bạn có thể đi đến bộ phận mua hàng.
Bạn có thể sẽ gọi cho ai đó để mua
hàng và yêu cầu họ đặt hàng hộp mực mới cho bạn.
Sau đó, nhiệm vụ của họ là tìm một cửa hàng
địa phương cung cấp mặt hàng thực tế mà bạn muốn đặt.
Và điều này có nghĩa là bạn sẽ không đi và đặt hàng trực tiếp món đồ đó một mình.
Bạn đang yêu cầu ai đó làm điều đó cho bạn.
Và sau đó thông qua chuyên môn và kiến thức của họ về
những người có sản phẩm đó trong kho, họ sẽ
lấy lại cho bạn.
Vì vậy, đây là một mức độ chuyển hướng liên quan đến bạn. Bạn không đi trước mà chỉ
cần đi xuống cửa hàng và mua nó. Bạn đến bộ phận mua hàng, bộ phận
của người đó biết rằng họ sẽ đi và làm mọi thứ cho bạn.
Đây là khái niệm tương tự về con trỏ trong lập trình.
Trong ngôn ngữ lập trình, indirection là khả năng tham chiếu một thứ gì đó bằng cách sử
dụng tên hoặc tham chiếu hoặc vùng chứa thay vì chính giá trị.
Chúng tôi sử dụng một hình thức tương tác bằng cách sử dụng tên biến.
Chúng tôi không sử dụng địa chỉ bộ nhớ để truy cập dữ liệu.
Chúng tôi sử dụng một tên biến.
Hình thức điều hướng phổ biến nhất là hành động thao tác một giá trị thông qua
địa chỉ bộ nhớ của nó.
Vì vậy, ngoài một mô tả thực sự nhỏ
về việc chuyển hướng bằng cách sử dụng một tên biến để đại diện cho địa chỉ bộ nhớ, bạn cũng
thao tác với một giá trị thông qua địa chỉ bộ nhớ của nó bằng chính địa chỉ đó.
địa chỉ của chính nó.
Vì vậy, một con trỏ cung cấp một phương tiện gián tiếp để truy cập giá trị của một mục dữ liệu cụ thể.
Đó là một biến có giá trị là địa chỉ bộ nhớ
và điều này rất quan trọng để hiểu.
Chúng tôi đã học các biến cho đến thời điểm này có chứa một
số loại dữ liệu nhất định, số,
ký tự, nhân đôi, số trôi nổi với số hữu tỉ.
Bây giờ chúng ta sẽ có một biến
không lưu trữ bất kỳ loại dữ liệu nào.
Kiểu lưu trữ dữ liệu là địa chỉ bộ nhớ.
Địa chỉ bộ nhớ sẽ được biểu diễn dưới dạng số nguyên, số
thập lục phân, nhưng nó
vẫn sẽ là địa chỉ bộ nhớ.
Vì vậy, nó sẽ là giá trị của
một địa chỉ và một vị trí khác của bộ nhớ nếu đó là một biến
hiện có hoặc một vị trí mới mà bạn cấp phát động.
Vì vậy, cũng như có những lý do tại sao bạn nên đi qua bộ
phận mua hàng để đặt mua hộp mực mới, bạn
không cần phải biết cửa hàng cụ thể nào mà hộp mực đang được đặt hàng chẳng hạn.
Ngoài ra còn có những lý do chính đáng tại sao việc sử dụng con
trỏ và c Sử dụng các biến này đại diện cho một địa chỉ, một địa chỉ bộ nhớ là hợp lý.
Chúng tôi đã nói về địa chỉ bộ nhớ trong phần đầu của khóa học.
Và làm thế nào bất cứ khi nào bạn chạy một chương trình và bạn tạo các biến được lưu trữ trong bộ nhớ.
Và bộ nhớ đó có một địa chỉ cụ thể. Bạn phải biết địa chỉ để lấy lại dữ liệu
đó, giống như bạn cần biết địa chỉ của một ngôi nhà nếu bạn đang lái xe đến một nơi nào đó hoặc
địa chỉ của một địa điểm.
Vì vậy, sử dụng con trỏ trong chương trình của bạn là một trong những công cụ mạnh mẽ nhất hiện có trong ngôn ngữ c.
Đó là lý do tại sao điều quan trọng là phải hiểu.
Bất kỳ chương trình nào trong c là nội dung sẽ sử dụng con trỏ.
Vì vậy, bạn phải hiểu khái niệm này.
Và đối với các lập trình viên đã lập trình các ngôn ngữ hiện
đại hơn như java hoặc c sharp, bạn không nhất thiết
phải lo lắng về điều này vì
tất cả phân bổ bộ nhớ và không có khái
niệm thực sự về con trỏ.
Mặc dù bên dưới, java
sử dụng con trỏ vì chúng có bản sao của các tham chiếu.
Đó là cùng một loại khái niệm. Nhưng trong c, bạn rõ ràng
có một biến đại diện cho một địa chỉ.
Con trỏ cũng là một trong những khái niệm khó hiểu nhất của ngôn ngữ c.
Chúng có xu hướng bị lạm dụng
mà chúng có xu hướng không được hiểu đầy đủ, đặc biệt là bởi các lập trình viên mới.
Vì vậy, điều quan trọng là bạn phải tìm ra khái niệm này ngay từ đầu
và có ý tưởng rõ ràng về những gì đang xảy ra khi
bạn ngày càng đi sâu vào khái niệm con trỏ c ngày càng nâng cao và ngày càng nâng cao hơn.
Vì vậy, nếu bạn chưa hiểu điều này trong
đầu, hãy nghiên cứu, nghiên cứu và thực hành viết code với con trỏ.
Trình biên dịch phải biết kiểu dữ liệu được lưu trữ
trong biến mà nó trỏ tới. Vì vậy, nó giống như một biến
thông thường và bạn phải chỉ định kiểu dữ liệu khi tạo con trỏ.
Lý do mà trình biên dịch cần biết đây cũng là lý do đối với các biến,
nó cần biết lượng dữ liệu cần phân bổ ngay cả khi bạn đang trỏ đến một số dữ liệu.
Mọi con trỏ sẽ được liên kết với một loại biến cụ thể.
Nó chỉ có thể được sử dụng để trỏ đến các biến kiểu đó, chúng
tôi sẽ đưa ra một ví dụ về điều này khi chúng ta nói về việc xác định một con trỏ.
Vì vậy, ví dụ con trỏ kiểu con
trỏ tới nó chỉ có thể trỏ đến các biến kiểu int.
Một lần nữa, một biến có giá
trị là một địa chỉ, đó là một con trỏ.
Địa chỉ đó có thể chứa một giá trị ở đâu đó trong bộ nhớ.
Con trỏ của kiểu con trỏ đến float chỉ có thể trỏ đến các biến của kiểu float.
Vì vậy, đây là một ý tưởng
minh họa cung cấp cho bạn khái niệm về một con trỏ.
Đừng lo lắng về cú pháp ở đây.
Chúng tôi đã thảo luận ngắn gọn về nó trong các bài giảng trước đây ký hiệu này và và dấu hoa thị này, bạn
không nhất thiết phải lo lắng về điều đó. Điều tôi muốn bạn chú ý
ở đây là con trỏ nó có địa chỉ như thế nào và địa chỉ đó
có thể chứa một giá trị nhưng nằm ở một nơi khác trong bộ nhớ.
Vì vậy, trong ví dụ này, chúng tôi đang tạo một số thông
thường, chúng tôi đã tạo một triệu lần, sau đó bạn thấy cú pháp này với dấu hoa thị
biểu thị rằng đó là một con trỏ. Chúng ta sẽ đi qua chi tiết về vấn đề đó.
Bạn cũng thấy dấu và, cho biết đó là một địa chỉ.
Vì vậy, trong ví dụ này khi chúng ta tạo con trỏ kiểu int p number, chúng
ta đang gán một địa chỉ. Bởi vì hãy nhớ rằng, con trỏ chỉ có thể lưu trữ địa chỉ.
Và cách điều này thực sự được trình bày trong
bộ nhớ là bạn có một số
tên biến và số có giá trị là 99.
Số cũng có một địa chỉ trong bộ nhớ.
Địa chỉ đó trong bộ nhớ là giá trị của con trỏ.
Vì vậy, số p là một con trỏ trỏ đến địa chỉ 1008.
1008 có giá trị là 99, chứa
cả số biến.
Vì vậy, đây thực sự là những gì chúng tôi đang nhận được. Nếu điều này không rõ ràng, bạn cần xem
nó trong một giờ và chắc chắn rằng bạn hiểu nó.
Một lần nữa, điểm là một con trỏ có giá trị đến một địa
chỉ, đó là những gì nó lưu trữ.
Và sau đó bạn thực sự có thể truy cập giá trị trong địa chỉ đó bằng cách sử dụng cú pháp nhất định.
Vì vậy, tại sao lại sử dụng con trỏ, tại sao thậm chí phải đào sâu khái niệm này, tại sao
chúng ta không thể chỉ sử dụng các kiểu dữ
liệu hiện có mà chúng ta sử dụng và sử dụng mảng ký tự khi chúng ta muốn sử dụng chuỗi.
Chà, việc truy cập dữ liệu chỉ bằng các biến là rất hạn chế.
Với con trỏ, bạn có thể truy cập bất kỳ vị trí nào, bạn có thể coi bất kỳ vị trí
nào của bộ nhớ như một biến chẳng hạn và sau đó bạn có thể thực hiện số
học với con trỏ, điều này làm cho mọi thứ dễ dàng hơn.
Con trỏ trong c làm cho việc sử dụng mảng và chuỗi dễ dàng
hơn, và chúng ta cũng sẽ xem xét vấn đề đó, đó là một lợi thế khác khi sử dụng con trỏ.
Con trỏ cho phép bạn tham chiếu đến cùng một không gian và bộ nhớ với nhiều vị trí.
Vì vậy, điều này có nghĩa là bạn có thể cập nhật bộ nhớ ở
một vị trí và sau đó thay đổi có thể được nhìn thấy từ một vị trí khác trong chương trình của bạn.
Đó là một cách sử dụng dữ liệu toàn cục nhưng vẫn có các hàm bên trong được đóng gói.
Bạn cũng có thể tiết kiệm nhiều dung lượng bộ nhớ bằng cách có thể chia sẻ các thành phần trong
cấu trúc dữ liệu của mình.
Vì vậy, hãy nhớ rằng, khi c được phát minh, c được phát minh vào những năm 70.
Ý tưởng của c là rất hiệu quả và ở mức thấp.
Ý tưởng truy cập bộ nhớ trực tiếp thông qua con trỏ
rất hiệu quả
và nó cũng rất nhanh.
Con trỏ cũng cho phép các hàm sửa đổi dữ liệu được truyền vào chúng
dưới dạng các biến. Điều này được thông qua bằng cách tham khảo. Chúng ta sẽ có một bài giảng về điều này.
Đây là nơi bạn có thể truyền các đối số cho một hàm bằng các con trỏ của mình.
Và sau đó bên trong chức năng, khi bạn thay đổi dữ liệu
đó, thay đổi sẽ được phản ánh bên ngoài chức năng đó.
Vì vậy, chúng tôi không còn phải sử dụng dữ liệu toàn cầu.
Chúng ta có thể sử dụng dữ liệu bên trong một hàm, truyền dữ
liệu đó dưới dạng một con trỏ và sau đó dữ liệu bên
ngoài hàm đó sẽ được cấp phát. Vì vậy, nó không có bất lợi khi
sử dụng các biến toàn cục nơi mọi thứ được kết hợp chặt chẽ với
nhau, bạn có thể giới hạn điều đó ở chỉ dữ liệu chỉ cần các hàm cần biết dữ liệu đó.
Như tôi đã đề cập, nó cũng có thể được sử dụng để tối ưu hóa chương trình chạy
nhanh hơn và sử dụng ít bộ nhớ hơn so với
cách khác, đây là một khái niệm
quan trọng, đặc biệt là trong các chương trình thời gian thực được nhúng.
Con trỏ cũng cho phép chúng ta nhận nhiều giá trị từ một hàm.
Chúng tôi đã nói về các hàm về cách bạn có thể chuyển các hàm dữ liệu.
Chúng tôi cũng đã nói về cách bạn có thể trả lại dữ liệu.
Chúng tôi biết rằng ngay bây giờ bạn chỉ có thể trả về một giá trị từ một hàm.
Nhưng nếu bạn sử dụng con trỏ, bạn thực sự có thể trả về nhiều giá trị từ một hàm.
Và chúng ta sẽ nói về điều đó. Đó là một lợi thế lớn.
Chúng ta cũng sẽ nói về phân bổ bộ nhớ động.
Ngay bây giờ khi chúng ta tạo bộ nhớ cho một chương trình, nó được
trình biên dịch thực hiện ngầm khi bạn khai báo một biến.
Nếu bạn khai báo một biến int, nó sẽ tự động tạo 4 byte cho biến đó chẳng hạn.
Khi bạn đang sử dụng mảng và bạn chỉ định kích thước của một
mảng, kích thước đó sẽ được cấp phát tại thời điểm biên dịch.
Vì vậy, nếu bạn đang cố gắng lưu trữ nhiều dữ liệu hơn mức đó, thì bạn đã bị
hỏng, chương trình của bạn sẽ không hoạt động.
Nhưng nếu bạn có khả năng thực sự tạo ra
nhiều bộ nhớ như bạn cần trong thời gian chạy, thì điều
đó sẽ rất lớn. Và con trỏ cho phép bạn làm điều này.
Chúng cho phép bạn tạo bộ nhớ ở thời gian chạy động, cấp phát bộ nhớ.
Chúng ta cũng sẽ nói về điều này.
Con trỏ cho phép chúng ta thiết kế và phát triển các cấu trúc dữ liệu phức tạp hơn.
Và cấu trúc dữ liệu là thứ lưu trữ dữ liệu.
Ví dụ về cấu trúc dữ liệu là ngăn xếp một cue hoặc một danh sách được liên kết.
Và chúng ta có thể tạo những con trỏ dễ dàng hơn nhiều.
Con trỏ cung cấp khả năng truy cập bộ nhớ trực tiếp, một lần nữa, hiệu quả nhanh chóng.
Vì vậy, con trỏ sẽ là một khái niệm lớn. Chúng tôi sẽ có rất nhiều bài giảng về con trỏ.
Tôi muốn các bạn tập trung và tôi muốn các bạn chú ý khi tôi nói về tất cả
những khái niệm này vì điều quan trọng và sống còn để hiểu ngôn ngữ lập trình c.
Vì vậy, chúc may mắn, và chúng ta hãy bắt đầu. Cảm ơn bạn.