Danh mục

Giáo trình ngôn ngữ C++ Part 11

Số trang: 9      Loại file: pdf      Dung lượng: 696.28 KB      Lượt xem: 24      Lượt tải: 0    
tailieu_vip

Phí tải xuống: 1,000 VND Tải xuống file đầy đủ (9 trang) 0
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

V.4 - Con trỏ và mảngTrong phần này chúng xem xét kỹ hơn về các tổ chức của mảng trong bộ nhớ; liên hệ giữa mảng, các phần tử của mảng với con trỏ, các phép toán trên con trỏ. Tuy nhiên con trỏ là một kiểu quan trong của C. Trong phần này chúng tôi chưa đề cập tới hết tất cả các khía cạnh của con trỏ như cấp phát động, tryền tham số hàm là con trỏ, danh sách liên kết. Các nội dung này sẽ được giới thiệu trong chuyên đề kỹ hơn về C....
Nội dung trích xuất từ tài liệu:
Giáo trình ngôn ngữ C++ Part 11 Gi¸o tr×nh tin häc c¬ së II - Ngôn ngữ C V.4 - Con trỏ và mảng Trong phần này chúng xem xét kỹ hơn về các tổ chức của mảng trong bộ nhớ; liên hệgiữa mảng, các phần tử của mảng với con trỏ, các phép toán trên con trỏ. Tuy nhiên contrỏ là một kiểu quan trong của C. Trong phần này chúng tôi chưa đề cập tới hết tất cả cáckhía cạnh của con trỏ như cấp phát động, tryền tham số hàm là con trỏ, danh sách liên kết.Các nội dung này sẽ được giới thiệu trong chuyên đề kỹ hơn về C. V.4.1 - Con trỏ và các phép toán trên con trỏ Trong phần đầu trình bày về kiểu dữ liệu và các phép toán chúng ta cũng đã đề cập tớikiểu con trỏ, trong phần này chúng ta dề cập chi tiết hơn về con trỏ và các phép toán cóthể sử dụng trên chúng. Con trỏ là kiểu dữ liệu mà một thành phần kiểu này có thể lưu trữ địa chỉ của mộtthành phần nào đó (có thể là biến, hằng, hàm), hoặc ta nói nó trỏ tới thành phần đó. 79 Gi¸o tr×nh tin häc c¬ së II - Ngôn ngữ C Một con trỏ lưu trữ địa chỉ của một thành kiểu T thì ta nói p là con trỏ kiểu T, đặc biệtnếu T là một kiểu con trỏ, hay nói cách khác, p lưu trữ địa chỉ của một con trỏ khác thì tanói p là con trỏ trỏ tới con trỏ. Cú pháp khai báo con trỏ * ; Ví dụ: int *p; // p là con trỏ kiểu int float * q ; // q là con trỏ kiểu float char *s ; // s là con trỏ kiểu char hay xâu kí tự int ** r; // r là con trỏ tới con trỏ kiểu int Cũng giống như biến bình thường khi khai báo một biến con trỏ, chương trình dịchcũng cấp phát vùng nhớ cho biến đó, lưu ý rằng giá trị trong vùng nhớ đó đang là baonhiêu thì quan niệm đó là địa chỉ mà con trỏ này trỏ tới. Vì vậy các bạn phải chú ý khidùng con trỏ phải bảo đảm nó trỏ tới đúng vùng nhớ cần thiết. Một con trỏ chưa lưu trữ địa chỉ của thành phần nào ta gọi là con trỏ rỗng và có giá trịlà NULL (là một hằng định nghĩa sẵn thực ra = 0). Khi gặp các lệnh khai báo biến trong chương trình thì chương trình dịch sẽ cấp phátvùng nhớ phù hợp và gắn tên biến với vùng nhó đó. Ví dụ: int tuoi; float luong;Nếu chúng ta có con trỏ p kiểu float, p lưu địa chỉ của luong và luong 65000 như sau: giả sử địa chỉ 1000 float luong; float * p; 80 Gi¸o tr×nh tin häc c¬ së II - Ngôn ngữ C p = &luong; *p = 650000 Khi con trỏ trỏ tới một vùng nhớ ví dụ như p trỏ tới luong thì khi truy xuất *p chính làgiá trị của vùng nhớ do p trỏ tới tức là *p ⇔ luong. Với con trỏ trỏ tới một con trỏ khác chẳng hạn như ví dụ sau: int a = 10; int *pa; int **ppa; pa = &a; // p trỏ tới a ppa = &pa; // ppa trỏ tới pa thì chúng ta có: *ppa ⇔ pa ⇔ &a; **ppa ⇔ *pa ⇔ a;• Các phép toán trên con trỏ (địa chỉ ) a. Phép so sánh hai con trỏ Trên con trỏ tồn tại các phép so sánh (= =, !=, =) hai con trỏ bằng nhau làhai con trỏ cùng trỏ tới một đối tượng (có giá trị bằng nhau), ngược lại là khác nhau. Contrỏ trỏ tới vùng nhớ có địa chỉ nhỏ hơn là con trỏ nhỏ hơn. 81 Gi¸o tr×nh tin häc c¬ së II - Ngôn ngữ C b. Phép cộng con trỏ với số nguyên Giả sử p là con trỏ kiểu T, k là số nguyên thì (p + k) cũng là con trỏ kiểu T, khôngmất tổng quát giả sử p trỏ tới phần tử t thì p+1 là con trỏ trỏ tới một phần tử kiểu T kế tiếp sau t p+2 trỏ tới một phần tử kiểu T kế tiếp sau t 2 phần tử,... p -1 là con trỏ trỏ tới một phần tử kiểu T kế tiếp trước t p -2 trỏ tới một phần tử kiểu T kế tiếp trước t hai phần tử,... tổng quát p+k trỏ tới phần tử cách t một khoảng k phần tử kiểu T (nếu k >0 dịch về phía địa chỉ lớn, k Gi¸o tr×nh tin häc c¬ së II - Ngôn ngữ Cliệu của các phần tử mảng là gì (tương ứng là 1,2,4,.. byte). Và địa chỉ của ô nhớ là địachỉ của byte đầu tiên trong các byte đó. Ví dụ 1: chúng ta định nghĩa mảng A kiểu nguyên: int A[5]; Chương trình dịch sẽ cấp phát một vùng nhớ 5 × 2 = 10 byte cho mảng A, giả sử rằngvùng nhớ đó có địa chỉ là 100 (byte đầu tiên có địa chỉ là 100 ). thì các phần tử của Anhư hình sau: (mảng A có 5 phần tử kiểu int) Ví dụ 2: chúng ta định nghĩa mảng X kiểu float: float X[6]; Chương trình dịch sẽ cấp phát một vùng nhớ 6 × 4 = 24 byte cho mảng X, giả sử rằngvùng nhớ đó có địa chỉ là 200 ( byte đầu tiên có địa chỉ là 200) thì các phần tử của Xđược cấp phát là địa chỉ của X[0] là 200 (&X[0] = 200), ...

Tài liệu được xem nhiều: