Xin chào, và chào mừng trở lại.
Trong bài giảng này, tôi muốn nói về việc truy cập giá trị mà
một con trỏ trỏ đến Vì
vậy, hãy nhớ con trỏ, chúng lưu trữ địa chỉ bộ nhớ.
Địa chỉ bộ nhớ đó thực sự chứa một giá trị của một nơi nào đó.
Và vì vậy các con trỏ trỏ đến địa chỉ bộ nhớ đó. Tôi muốn nhận được giá trị của
những gì nó trỏ đến.
Bởi vì tôi sẽ chỉ in ra giá trị của một con trỏ sẽ là một địa chỉ, nhưng tôi muốn lấy địa chỉ,
tôi muốn lấy giá trị của địa chỉ.
Vì vậy, bạn có thể truy cập giá trị của một địa chỉ mà một con trỏ đang
trỏ đến bằng cách sử dụng toán tử chuyển hướng. Toán tử điều hướng là dấu hoa thị.
Vì vậy, chúng ta đã học cách sử dụng dấu hoa thị để khai báo một
con trỏ, chúng ta cũng sẽ sử dụng dấu hoa thị để tìm giá trị mà một con trỏ đang trỏ tới.
Vì vậy, nó còn được gọi là toán tử tham chiếu bởi vì
bạn sử dụng nó để bỏ tham chiếu một con trỏ.
Vì vậy, ví dụ, nếu bạn có một số bằng 15, bạn khai báo con
trỏ kiểu int, trỏ đến một int và bạn gán cho nó địa chỉ của số bằng cách sử dụng dấu và.
Bây giờ bạn làm cách nào để lấy giá trị của con trỏ đang trỏ tới.
Bạn có thể hủy tham khảo.
Về cơ bản, bạn có thể biết giá trị mà con trỏ
trỏ tới là giá trị 15 vì nó đang trỏ đến địa chỉ của số là 15.
Vì vậy, biến con trỏ chứa địa chỉ của số biến.
Bạn có thể sử dụng giá trị này trong một biểu thức để tính giá trị mới cho kết quả.
Vì vậy, giả sử chúng tôi muốn làm cho kết quả bằng giá
trị mà con trỏ trỏ đến cộng với năm. Bạn sẽ sử dụng dấu hoa
thị cho nó trước tên của con trỏ.
Và vì vậy điều này sẽ làm là về cơ bản nó sẽ nói biến
con trỏ trỏ đến là gì, nó trỏ đến 15 thêm năm vào nó.
Đó là địa chỉ
mà con trỏ đang trỏ đến giá trị của địa chỉ đó.
Vì vậy, dấu hoa thị của toán tử
điều hướng mà bạn cần lưu ý cũng là biểu tượng được sử dụng cho phép nhân và nó cũng được
sử dụng khi bạn khai báo các loại con trỏ. Vì vậy, điều này có thể trở nên rất khó hiểu.
Làm thế nào để bạn biết nhất thiết những gì đang xảy ra hoặc trình biên dịch hoạt động như thế nào.
Vâng, đó là tất cả về bối cảnh. Nó phụ thuộc vào thời điểm bạn sử dụng dấu hoa thị đó và nơi bạn sử dụng nó.
Nếu bạn sử dụng dấu hoa thị khi bạn khai báo một con trỏ ngay
sau loại con
trỏ, thì rõ ràng nó đang sử dụng một khai báo.
Nếu bạn sử dụng dấu hoa thị ở giữa hai
số, thì nó được sử dụng để nhân. Và nếu nó được sử
dụng ngay trước tên con trỏ ở phía bên phải hoặc bên trái, nó sẽ
gán một giá trị hoặc truy cập một giá trị.
Vì vậy, đó là tất cả về ngữ cảnh khi bạn sử dụng toán
tử chuyển hướng này.
Và đó là cách nó hoạt động.
Vì vậy, đó là cách trình biên dịch sẽ diễn giải nó.
Bất cứ khi nào bạn nhìn thấy nó trong, ví dụ này,
con trỏ dấu sao và bạn không có kiểu dữ liệu trước đó hoặc bạn không
có hai số ở mỗi bên, thì bạn biết đó là con trỏ chuyển hướng, đang tham chiếu.
Vì vậy, chúng ta hãy đi qua một ví dụ. Đây là một
ví dụ khác mà chúng ta sẽ tạo
một số nguyên bằng 10. Chúng ta cũng sẽ tạo một số nguyên kiểu có tên là x một biến khác.
Chúng tôi đang khởi tạo số đếm thành 10, x được khởi tạo không có gì.
Sau đó, chúng tôi tạo một con trỏ int. Chúng tôi biết đó là con trỏ int
vì chúng tôi có dấu hoa thị sau kiểu dữ liệu và
sau đó chúng tôi đặt tên cho nó là con trỏ int.
Bây giờ chúng ta sẽ gán cho con trỏ int đó địa chỉ của số lượng.
Bởi vì hãy nhớ rằng, con trỏ chỉ chứa địa chỉ làm giá trị của chúng, nhưng
chúng cũng đang trỏ đến một cái gì đó.
Vì vậy, sau đó chúng ta có thể gán biến x bất kỳ con trỏ int nào đang
trỏ đến, giá trị của địa chỉ chứa trong con trỏ là gì.
Vì vậy, x sẽ thực sự hiển thị 10.
10. Vì vậy, nếu chúng ta tiếp tục và hiển
thị rằng số phần trăm d thứ x phần trăm thứ ba, số đếm bằng 10, x sẽ bằng 10.
Đó là cách bạn có thể tham chiếu đến một con trỏ và nhận được giá trị đó. Nó trỏ đến nếu bạn muốn hiển thị
các giá trị của con trỏ vì hãy nhớ rằng một con trỏ
có một giá trị trong bộ nhớ, nó
chỉ là một địa chỉ. Vì vậy, điều gì xảy
ra nếu bạn muốn hiển thị giá trị con trỏ, được biểu
thị bằng số nguyên và địa chỉ số thập lục phân?
Chà, bạn có thể sử dụng định dạng phần trăm p. Chúng tôi đã nói về điều này trước đây.
Điều này sẽ xuất ra một giá trị con trỏ dưới dạng địa chỉ bộ nhớ ở dạng thập lục phân.
Vì vậy, nếu chúng ta làm điều gì đó như
thế này, trong đó, chúng ta khai báo
số của mình, chúng ta khai báo con trỏ của chúng ta, chúng ta khởi tạo nó thành null vì đó là phương pháp hay, chúng ta muốn
luôn làm điều đó bất cứ khi nào bạn không gán một cái gì đó trong khai báo cho con trỏ, hãy chắc chắn rằng bạn
khởi tạo nó thành null.
Sau đó, chúng tôi gán biến số của chúng tôi là 10.
Và sau đó chúng tôi gán con trỏ của chúng tôi cho địa chỉ của số.
Vì vậy, giá trị của số p thực sự sẽ là một địa chỉ.
một địa chỉ. Vì vậy, nếu chúng ta cố gắng in nó ra, chúng ta sẽ sử dụng phần trăm p và đó sẽ là giá trị của địa chỉ.
Nếu chúng tôi muốn in ra những gì nó trỏ đến, chúng tôi phải hủy
tham chiếu nó bằng cách sử dụng toán tử chuyển hướng.
Nhưng khi bạn in ra địa chỉ, những gì nó làm là nó in nó ra
ở dạng thập lục phân và con trỏ chiếm 8 byte trong
bộ nhớ và địa chỉ có 16 chữ
số thập lục phân. Vậy làm thế nào mà làm việc?
Điều đó phụ thuộc vào việc máy của bạn có hỗ trợ địa chỉ 64-bit hay 32-bit hay không.
Nếu máy của bạn có hệ điều hành 64-bit, thì bạn
sẽ thấy 16 chữ số thập lục phân.
Nếu máy của bạn hoặc hệ điều hành của bạn chỉ có địa chỉ
32-bit, thì bạn sẽ thấy số thập lục phân được biểu thị dưới dạng 8 chữ số thập lục phân.
Bây giờ điều gì xảy ra nếu bạn muốn hiển thị một địa chỉ.
Bạn có thể nói sự khác biệt là gì bởi vì con trỏ có một giá trị.
Nhưng bạn cũng có thể hiển thị địa chỉ với địa chỉ của nhà điều hành.
Vì vậy, trong ví dụ này, chúng tôi muốn hiển thị địa chỉ của số.
Số không phải là một con trỏ. Số chỉ là một số nguyên.
Nếu chúng ta muốn lấy địa chỉ của địa chỉ đó, chúng ta sử dụng dấu "và".
Nếu chúng tôi muốn hiển thị địa chỉ của nó, bạn chỉ cần sử dụng lại phần trăm p.
Bạn chỉ cần áp dụng dấu và.
Vì vậy, nếu chúng tôi cung cấp ký hiệu và với biến con trỏ, chúng tôi sẽ
thực sự hiển thị địa chỉ của con trỏ
đó, chứ không phải giá trị của điểm. Hãy nhớ địa chỉ của con trỏ là một số địa chỉ trong bộ nhớ.
Giá trị con trỏ là một địa chỉ mà nó trỏ tới.
Và giá trị mà nó trỏ tới nằm ở một nơi khác trong bộ nhớ.
Vì vậy, hãy nhớ rằng minh họa mà chúng
tôi đã chỉ ra cách hoạt động của con trỏ.
Một con trỏ, khi bạn khai báo nó, sẽ tạo bộ nhớ cho con trỏ
đó, 8 byte.
Giá trị của con trỏ đó là một địa chỉ.
Và sau đó bất kỳ giá trị nào mà con
trỏ trỏ tới đều là một giá trị, thường là loại mà bạn đã cung cấp.
Nhưng hãy nhớ rằng, thực sự có ba phần của nó.
Nếu bạn muốn in ra địa chỉ số p, một lần nữa bạn sẽ sử dụng dấu và.
Đó sẽ là địa chỉ của con trỏ thực tế.
Và bạn sẽ phải sử dụng dấu sao trống để nhận được một cảnh báo.
Vì vậy, hãy nhớ rằng, bản thân một con trỏ có một địa chỉ, giống như bất kỳ biến nào
khác, nó sẽ được cấp phát khi bạn khai báo.
Bạn sử dụng phần trăm p làm đại lượng chuyển đổi để hiển thị địa chỉ.
Bạn sử dụng ký hiệu và địa chỉ của toán tử để tham chiếu đến
địa chỉ mà biến số p chiếm giữ.
Đó là địa chỉ của con trỏ. Sau đó, một lần nữa, con trỏ có
giá trị là một địa chỉ.
Việc ép kiểu void là để ngăn cảnh báo từ trình biên dịch, cụ
thể là đặc tả phần trăm p mong đợi giá trị là một loại kiểu con trỏ nào đó.
Nhưng loại ký hiệu và số là một con trỏ trỏ đến một con trỏ của nó.
Và vì vậy bạn phải cast nó.
Hiển thị số byte mà một con trỏ đang sử dụng.
Một cách khác để lấy thông tin về một con trỏ.
Ở đây bạn có thể sử dụng toán tử sizeof. Chúng ta đã tìm hiểu về toán tử
sizeof để hiển thị các byte kiểu dữ liệu khác nhau. Bạn có thể làm điều tương tự với một con trỏ.
Trên máy mà tôi đang chạy, nó sẽ chiếm 8 byte.
Và địa chỉ máy có 64 bit vì
nó là hệ điều hành 64 bit.
Và bạn có thể nhận được cảnh báo trình biên dịch khi sử dụng sizeof theo cách này, sizet
là một kiểu số nguyên được xác định thực thi.
Để ngăn cảnh báo, bạn có thể truyền đối số thành kiểu int như thế này.
Vì vậy, những gì bạn sẽ làm là bạn sẽ nói kích thước số p, phần trăm d byte.
Và bạn sẽ nói int, truyền nó thành một số p kích thước inch.
Điều đó sẽ cung cấp cho bạn kích thước của con trỏ trong bộ nhớ, kích thước của con trỏ của
địa chỉ đó, một lần nữa, là tám byte trên hầu hết các hệ thống.
Bởi vì nó chỉ chứa một địa chỉ.
Một ví dụ khác ở đây. Điều này sẽ hiển thị một số thứ.
Và chúng tôi sẽ chạy ví dụ này để hiển thị đầu ra.
Nhưng ngay trước khi chúng tôi chạy nó, tôi muốn mô tả một chút những gì đang xảy ra ở đây. Chúng tôi có một số đã được khai báo.
Chúng tôi có một con trỏ được khởi tạo null.
Chúng tôi đặt giá trị của số thành 10.
Và sau đó những gì chúng ta muốn làm là chúng
ta muốn in ra địa chỉ của số nguyên, và chúng ta muốn in ra giá trị của số, rất
đơn giản, sử dụng địa chỉ của toán tử và sau đó chỉ là biến.
Khi chúng tôi thực hiện địa chỉ của toán tử, chúng tôi thực hiện phần trăm p.
Sau đó, chúng tôi sẽ gán địa chỉ của số cho con trỏ của chúng tôi.
Sau đó, chúng tôi sẽ in ra một số thông tin con trỏ.
Chúng tôi muốn xuất địa chỉ của chính con trỏ.
Chúng ta chỉ có thể sử dụng phần trăm p, dấu sao void và số.
Chúng tôi muốn xem con trỏ đó có bao nhiêu byte trong bộ nhớ. Có thể nói là sizeof.
Chúng tôi muốn xem giá trị thực của con trỏ,
đó là một địa chỉ. Chúng ta chỉ có thể nói số p mà không cần
thêm bất kỳ thông tin nào và sau đó chúng ta sử dụng phần trăm p.
Nếu chúng ta muốn xem giá trị mà con trỏ
đang trỏ đến, giá trị tại địa chỉ, thì chúng ta đánh
dấu sao p number, chúng ta sử dụng toán tử indirection.
Và chúng ta biết rằng số p đang trỏ đến một in nên chúng ta có thể nói phần trăm d.
Vì vậy, hãy xem ví dụ này trong các khối mã để xem nó thực sự được hiển thị như thế nào.
Những gì chúng ta sẽ thấy là một số số thập lục phân
cho các địa chỉ bất cứ khi nào chúng ta hiển thị địa chỉ và chúng ta sẽ xem các giá trị trong các trường hợp khác.
Vì vậy, điều này sẽ trông quen thuộc. Đây chỉ là một chương trình
hướng dẫn bạn cách truy cập các phần khác nhau của một con trỏ.
Vì vậy, một lần nữa, chúng ta có kiểu dữ liệu số thông thường int và chúng ta có
con trỏ của chúng ta. Chúng tôi khởi tạo nó thành null.
Đầu tiên chúng tôi sẽ hiển thị số của chúng tôi, là 10. Vì vậy, nó sẽ hiển thị địa chỉ của
số, và sau đó nó sẽ hiển thị giá trị của số trên dòng 10 và 11.
Sau đó, chúng tôi sẽ gán con trỏ của chúng tôi, địa chỉ của số.
Nếu chúng ta muốn xem địa chỉ thực của con trỏ, chúng ta chỉ cần sử dụng ký hiệu và, địa
chỉ của toán tử, và chúng ta chuyển nó thành void star.
Chúng tôi sử dụng phần trăm p.
Nếu chúng ta muốn xem con trỏ có bao nhiêu byte trong bộ nhớ, chúng ta thực hiện phần trăm d sizeof.
Nếu chúng ta muốn xem địa chỉ giá trị của con trỏ lạc, chúng ta thực hiện phần trăm
p và chúng ta chỉ nói số p, vì số p là một địa chỉ.
Nếu chúng ta muốn xem con trỏ đang trỏ đến giá trị gì với giá trị của
địa chỉ nằm trong giá trị của con trỏ, chúng ta chỉ cần nói số
p dấu hoa thị, chúng ta tham khảo nó, toán tử điều hướng.
Vì vậy, hãy chạy cái này.
Khi tôi chạy điều này, bạn sẽ thấy hai thứ đầu
tiên được in ra, địa chỉ các số
ở dòng sáu và đó là một số thập lục phân, 0060ff0c.
Và điều này thực sự đang chạy một chương trình 32 bit, vì vậy bạn thấy nó chỉ có
8 bit.
biến số là 10.
Sau đó, chúng tôi in ra địa chỉ của con trỏ thực vào bộ nhớ được cấp phát.
Đó là một địa chỉ khác với số.
Vì đây là địa chỉ được cấp phát cho con trỏ.
Kích thước số của con trỏ là 4 byte và điều đó
có nghĩa là nó được đánh địa chỉ 32 bit.
Giá trị của con trỏ, là
địa chỉ của số, nó phải giống nhau, và nó là, 0060ff0c.
Và bạn thấy rằng bạn thực sự có thể lấy địa
chỉ số chỉ bằng cách sử dụng tên, con trỏ với phần trăm p.
Chúng tôi đã thấy kích thước của toán tử 4 byte.
Nếu bạn muốn nhận giá trị mà số p đang trỏ tới là 10, bạn
phải hủy tham chiếu nó bằng cách sử dụng toán tử chuyển hướng và bạn thấy rằng nó được in ra là 10.
Nhưng bạn thấy bạn sử dụng phần trăm p bất cứ khi nào bạn
hiển thị địa chỉ, sử dụng phần trăm e khi bạn đang hiển thị các giá trị của con
trỏ số nguyên hoặc số byte.
Vì vậy, đây là cú pháp cơ bản của việc truy cập các giá trị con trỏ.
Địa chỉ của con trỏ, dấu và, giá
trị mà con trỏ trỏ tới, chỉ là tên của
biến và bản thân giá trị của con trỏ chỉ là tên của biến, sau đó giá
trị mà con trỏ đang trỏ đến để sử dụng toán tử điều hướng.
Cảm ơn bạn. Hi vọng điêu nay co ich. Nghiên cứu cái này, chạy cái này qua.