Kiểu con trỏ, kiểu địa chỉ và các phép toán trên con trỏ Khai báo biến con trỏ

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 45 - 47)

c. Các ví dụ về dùng hàm đệ qu i:

4.3 Kiểu con trỏ, kiểu địa chỉ và các phép toán trên con trỏ Khai báo biến con trỏ

Khai báo biến con trỏ

<kiểu được trỏ> <*tên biến> ;

Địa chỉ của một biến là địa chỉ byte nhớ đầu tiên của biến đó. Vì vậy để lấy được nội dung của biến, con trỏ phải biết được số byte của biến, tức kiểu của biến mà con trỏ sẽ trỏ tới. Kiểu này cũng được gọi là kiểu của con trỏ. Như vậy khai báo biến con trỏ cũng giống như khai báo một biến thường ngoại trừ cần thêm dấu * trước tên biến (hoặc sau tên kiểu). Ví dụ:

int *p ; // khai báo biến p là biến con trỏ trỏ đến kiểu dữ liệu nguyên.

float *q, *r ; // hai con trỏ thực q và r. Các phép toán trên con trỏ

Có 4 phép tốn liên quan đến con trỏ và đại chỉ là : Phép gán.

Phép tăng giảm địa chỉ. Phép truy cập bộ nhớ. Phép so sánh.

Phép gán :

Phép gán chỉ thực hiện với các con trỏ cùng kiểu. Muốn gán các con trỏ khác kiểu phải dùng phép ép kiểu như ví dụ sau :

int x; char *pc;

pc=(char*)(&x); Phép tăng giảm địa chỉ :

Để minh hoạ chi tiết cho phép tốn này, ta xét ví dụ sau : Các câu lệnh :

float x[30],*px; px=&x[10];

cho con trỏ px là con trỏ float trỏ tới phần tử x[10]. Kiểu địa chỉ float là kiểu địa chỉ 4 byte, nên các phép tăng giảm địa chỉ được thực hiện trên 4 byte. Vì thế :

px+i trỏ tới phần tử x[10+i] px-i trỏ tới phần tử x[10-i] Xét ví dụ khác :

float b[40][50];

Khai báo trên cho ta một mảng b gồm các dòng 50 phần tử thực. Kiểu địa chỉ của b là 50*4=200 byte.

Do vậy :

b trỏ tới đầu dòng thứ nhất ( phần tử b[0][0]). b+1 trỏ tới đầu dòng thứ hai ( phần tử b[1][0]). ..........

b+i trỏ tới đầu dòng thứ i ( phần tử b[i][0]).

Phép truy cập bộ nhớ :

Con trỏ float truy nhập tới 4 byte, con trỏ int truy nhập 2 byte, con trỏ char truy nhập 1 byte. Giả sử ta có cá khai báo :

float *pf; int *pi; char *pc; Khi đó :

Nếu trỏ pi trỏ đến byte thứ 100 thì *pf biểu thị vùng nhớ 4 byte liên tiếp từ byte 100 đến 103.

Nếu trỏ pi trỏ đến byte thứ 100 thì *pi biểu thị vùng nhớ 2 byte liên tiếp từ byte 100 đến 101.

Nếu trỏ pc trỏ đến byte thứ 100 thì *pc biểu thị vùng nhớ 1 byte chính là byte 100.

Phép so sánh :

Cho phép so sánh các con trỏ cùng kiểu, ví dụ nếu p1 và p2 là các con trỏ cùng kiểu thì nếu :

p1<p2 nếu địa chỉ p1 trỏ tới thấp hơn địa chỉ p2 trỏ tới. p1=p2 nếu địa chỉ p1 trỏ tới cũng là địa chỉ p2 trỏ tới. p1>p2 nếu địa chỉ p1 trỏ tới cao hơn địa chỉ p2 trỏ tới. Ví dụ :

Ví dụ 1 :

Đoạn chương trình tính tổng các số thực dùng phép so sánh con trỏ : float a[100],*p,*pcuoi,tong=0.0;

int n;

pcuoi=a+n-1; /* Địa chỉ cuối dãy*/ for (p=a;p<=pcuoi;++p)

Ví dụ 2 :

Dùng con trỏ char để tách các byte của một biến nguyên, ta làm như sau : Giả sử ta có lệnh :

unsigned int n=0xABCD; /* Số nguyên hệ 16*/ char *pc;

pc=(char*)(&n); Khi đó :

*pc=0xAB (byte thứ nhất của n) *pc+1=0xCD (byte thứ hai của n)

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 45 - 47)