Biến con trỏ (pointer variables)

Một phần của tài liệu kỹ thuật lập trình c và c++ (Trang 71)

Nếu một biến sẽ chứa ựịa chỉ của một biến khác thì nó phải ựược khai báo là một con trỏ. Khai báo 1 biến là con trỏ gồm kiểu dữ liệu cơ sở, một dấu *, và tên biến. Dạng tổng quát ựể khai báo một biến con trỏ là

type *pointerVariable;

type: xác ựịnh kiểu dữ liệu của biến mà con trỏ có thể trỏ ựến. Vắ dụ con trỏ có kiểu int sẽ trỏ ựến biến có kiểu int. Do các phép toán số học trên con trỏ (tăng, giảm) liên quan ựến type của nó nên cần phải khai báo type của con trỏ ựúng ựắn.

2.1. Các toán tử con trỏ (pointer operators) Có 2 toán tử con trỏ là * và &.

Toán tử & là toán tử 1 ngôi mà trả về ựịa chỉ bộ nhớ của toán hạng của nó. (toán tử 1 ngôi chỉ yêu cầu 1 toán hạng).

Vắ dụ:

int count; int *m; m = &count;

Lệnh m=&count; ựặt ựịa chỉ bộ nhớ của biến count vào con trỏ m. Lệnh trên có thể phát biểu: "con trỏ m nhận ựịa chỉ của biến count.".

Giả sử biến count ựược cấp phát tại ựịa chỉ bộ nhớ 2000 ựể lưu trữ giá trị của nó. Giả sử rằng count có giá trị 100. Như vậy, tại ựịa chỉ bộ nhớ 2000 có chứa giá trị 100. Sau khi lệnh m = &count; ựược thực hiện thì m sẽ có giá trị là 2000.

Toán tử con trỏ * là toán tử một ngôi trả về giá trị tại ựịa chỉ con trỏ trỏ ựến.

Vắ dụ: q = *m;

Lấy giá trị tại ựịa chỉ mà m trỏ ựến và ựặt vào biến q. Như vậy q sẽ có giá trị là 100 (là giá trị của biến count).

2.2. Các thao tác trên con trỏ 2.2.1. Lệnh gán con trỏ

Ta có thể dùng một con trỏ ở bên phải của câu lệnh gán (=) ựể gán giá trị của 1 con trỏ cho một con trỏ khác. Vắ dụ:

int x;

int *p1, *p2; p1 = &x; p2 = p1;

Sau khi ựọan lệnh trên ựược thực hiện, cả hai p1 và p2 cùng trỏ ựến biến x.

2.2.2. Phép toán số học trên con trỏ

Chỉ có 2 phép toán số học ta có thể dùng trên con trỏ ựó là cộng và trừ. Giả sử p1 là một con trỏ nguyên với giá trị hiện tại là 2000. Cũng giả sử rằng số nguyên chiếm 2 bytes bộ nhớ. Như vậy, sau khi thực hiện lệnh p1++; thì p1 có giá trị là 2002 chứ không phải 2001. Tương tự, Giả sử p1 là một con trỏ nguyên với giá trị hiện tại là 2000. Cũng giả sử rằng số nguyên chiếm 2 bytes bộ nhớ. Như vậy, sau khi thực hiện lệnh p1--; thì p1 có giá trị là 1998 chứ không phải 1999.

Tổng quát từ 2 vắ dụ trên: Tất cả con trỏ sẽ tăng hay giảm với ựơn vị là kắch thước của kiểu dữ liệu của nó.

Ngoài toán tử tăng (++) và giảm (--), ta có thể cộng hay trừ số nguyên với con trỏ. Vắ dụ: theo hình minh họa trên.

Con trỏ char ch chứa ựịa chỉ 3000, vậy lệnh ch = ch + 3;

ch sẽ chứa ựịa chỉ 3003

Con trỏ nguyên i chứa ựịa chỉ 3000, vậy lệnh i = i + 2;

i sẽ chứa ựịa chỉ 3004

Lưu ý: ựơn vị tăng của con trỏ char là 1 byte, con trỏ int là 2 bytes.

Tương tự, giả sử con trỏ char ch chứa ựịa chỉ 3003, vậy lệnh ch = ch Ờ 3; ch sẽ chứa ựịa chỉ 3000 Giả sử kiểu nguyên (int) có kắch thức 2 bytes. Giả sử kiểu ký tự (char) có kắch thức 1 byte.

Giả sử con trỏ nguyên i chứa ựịa chỉ 3004, vậy lệnh i = i Ờ 2;

i sẽ chứa ựịa chỉ 3000

Một phần của tài liệu kỹ thuật lập trình c và c++ (Trang 71)