• Tidak ada hasil yang ditemukan

Chương 01.8: Con trỏ

N/A
N/A
Nguyễn Gia Hào

Academic year: 2023

Membagikan "Chương 01.8: Con trỏ"

Copied!
41
0
0

Teks penuh

Một biến chứa giá trị địa chỉ được gọi là biến con trỏ hoặc viết tắt là con trỏ. Nếu một con trỏ chứa địa chỉ của một biến thì ta nói rằng con trỏ trỏ tới biến đó. Lệnh này khai báo một biến con trỏ có tên ptr trỏ đến số nguyên int.

Nói cách khác, một con trỏ ptr có thể chứa địa chỉ của các biến số nguyên. Mặc dù dấu * nằm cạnh tên biến con trỏ nhưng nó vẫn được hiểu là một phần của kiểu. Khi bạn khai báo một biến con trỏ, biến con trỏ đó sẽ chứa giá trị null (trừ khi nó được khởi tạo).

Vì vậy, trước khi sử dụng con trỏ, chúng ta cần đặt địa chỉ vào đó. Một con trỏ tới bất kỳ loại nào chỉ có thể chứa địa chỉ của các biến thuộc loại đó. Địa chỉ của biến float không thể được gán cho con trỏ int.

Con trỏ chứa địa chỉ của một biến nên chúng ta có thể truy cập vào biến đó thông qua con trỏ.

Hình 8.1 Địa chỉ bộ nhớ
Hình 8.1 Địa chỉ bộ nhớ

Con trỏ trỏ tới void và con trỏ NULL

Con trỏ trỏ tới void và con trỏ NULL (tiếp)

Các phép toán trên con trỏ

Các phép toán trên con trỏ (tiếp)

So sánh hai con trỏ khi chúng trỏ đến cùng một đối tượng, tức là. trỏ đến cùng một biến. Phép gán: Một biến con trỏ có thể được gán cho một biến con trỏ có cùng kiểu con trỏ. Lưu ý: Khi sử dụng toán tử tăng hoặc giảm với một biến con trỏ, hãy lưu ý thứ tự thực hiện các phép toán.

Con trỏ trỏ tới con trỏ

Con trỏ trỏ tới con trỏ (tiếp)

Con trỏ, mảng và xâu ký tự

  • Con trỏ và mảng
  • Con trỏ và xâu ký tự
  • Con trỏ và mảng (tiếp)
  • Con trỏ và xâu ký tự (tiếp)

Con trỏ được sử dụng để truy cập các phần tử mảng và làm đối số cho hàm. Và khi mảng được truyền dưới dạng đối số cho hàm, con trỏ cũng rất hữu ích. Như chúng ta đã biết, tên biến mảng chính là địa chỉ phần tử đầu tiên của biến mảng.

Khi thêm một địa chỉ vào 2, trình biên dịch sẽ lấy kích thước của kiểu dữ liệu mảng nhân với 2 rồi thêm vào địa chỉ. Để truy cập phần tử thứ ba khi biết địa chỉ, hãy sử dụng toán tử truy cập gián tiếp *(a+2). Hằng số con trỏ và biến con trỏ: Tên của biến trường là địa chỉ cụ thể mà hệ thống đã chọn để đặt trường.

Địa chỉ này không thể thay đổi và được tồn tại miễn là biến mảng tồn tại. Người ta gọi con trỏ địa chỉ là hằng số bất biến. Không thể thay đổi địa chỉ nhưng có thể thay đổi biến con trỏ chứa địa chỉ đó.

Vì vậy, chúng ta có thể sử dụng ký hiệu con trỏ để truy cập các ký tự của chuỗi, giống như truy cập các phần tử của mảng. Con trỏ tới hằng chuỗi ký tự: Khi một biến chuỗi ký tự được khai báo và khởi tạo, chúng ta có thể khai báo nó dưới dạng một mảng ký tự hoặc khai báo nó dưới dạng một con trỏ tới một kiểu ký tự. Tuy nhiên, hai biến chuỗi này có một điểm khác biệt: s1 là địa chỉ, hằng số con trỏ, s2 là biến con trỏ; s2 có thể thay đổi và s1 không thể thay đổi.

Cũng giống như mảng có các biến kiểu int hoặc float, chúng ta cũng có mảng có con trỏ. Mảng con trỏ được sử dụng phổ biến nhất là mảng con trỏ tới các hằng chuỗi. Nếu được khai báo là mảng hai chiều thì các mảng con chứa chuỗi phải có cùng kích thước (10).

Nếu được khai báo bằng con trỏ, trình biên dịch C++ sẽ giữ các chuỗi liền kề trong bộ nhớ và sử dụng một mảng con trỏ để tham chiếu đến các chuỗi này (hình dưới đây hiển thị các chuỗi trong bộ nhớ). Một chuỗi ký tự là một mảng kiểu char, do đó, một mảng tham chiếu đến các ký tự chuỗi thực sự là một mảng tham chiếu đến char.

Quản lý bộ nhớ với new và delete

  • Cách sử dụng bộ nhớ của một chương trình C++
  • Hạn chế của mảng
  • Toán tử new và delete
  • Khởi tạo ô nhớ được cấp phát động 5. Mảng động
  • Hạn chế của việc lưu trữ bằng mảng
  • Toán tử new và delete (tiếp)
  • Khởi tạo ô nhớ được cấp phát động
  • Mảng động
  • Mảng động (tiếp)
  • Nhập vào 1 số nguyên dương. Cho biết số nguyên đó có phải là số nguyên tố không

Vùng bộ nhớ này được chia thành 3 phần: phần chứa mã chương trình, phần chứa các biến tĩnh và biến ngoài (gọi là Heap), phần chứa các biến tự động (gọi là Stack). Ngăn xếp mở rộng từ địa chỉ cao đến địa chỉ thấp, heap mở rộng từ địa chỉ thấp đến địa chỉ cao. Mảng rất hữu ích khi lưu trữ một số lượng lớn các biến hoặc đối tượng.

Tuy nhiên, khi viết chương trình, chúng ta phải xác định kích thước của mảng chứ không phải đợi đến khi chương trình được thực thi. Trong nhiều trường hợp, tại thời điểm viết chương trình, chúng ta không biết cần bao nhiêu bộ nhớ. Vấn đề này được khắc phục bằng cơ chế cấp phát bộ nhớ động nhờ các toán tử mới và xóa.

Con trỏ = Variable_dl_type mới; // Cấp phát con trỏ xóa; // Giải phóng bộ nhớ. Toán tử mới phân bổ một ô nhớ trên Heap, trong khi chương trình đang chạy, đủ để giữ giá trị kiểu dl_variable và trả về một con trỏ tới nó. Toán tử xóa sẽ giải phóng bộ nhớ được trỏ bởi biến con trỏ.

Việc sử dụng delete để giải phóng các vùng bộ nhớ không được cấp phát mới sẽ gây ra nhiều nguy hiểm. Nếu bộ nhớ Heap đã hết nhưng chúng ta vẫn đang cấp phát nó, new sẽ trả về một con trỏ null. Vì vậy, hãy luôn kiểm tra con trỏ được trả về bằng new trước khi sử dụng nó.

Chúng ta có thể khởi tạo các ô nhớ được cấp phát động bằng các ô mới. Với cơ chế cấp phát bộ nhớ động, chúng ta có thể cấp phát bộ nhớ cho một biến mảng. Điều này cho phép xác định số phần tử của mảng trong khi chương trình đang chạy.

Viết chương trình nhập vào một dãy n số nguyên và lưu trữ dãy đó vào một danh sách liên kết đơn P. Sắp xếp dãy theo thứ tự không giảm bằng cách sử dụng phương pháp sắp xếp chọn.

Gambar

Hình 8.1 Địa chỉ bộ nhớ

Referensi

Dokumen terkait

Việc tăng dày tam giác cho ảnh UAV được thực hiện qua các bước sau: + Đo các nối mô hình: quá trình này được thực hiện hoàn toàn tự động trong các phần mềm xử lý ảnh nội nghiệp; + Đo