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

0
237

Phép gán con trỏ

Hai con trỏ cùng kiểu có thể gán cho nhau.

Ví dụ

int a, *p, *q ;

float *f;  a = 5 ;

p = &a ; q = p ; /* đúng */

f = p ; /* sai do khác kiểu */

Ta cũng có thể ép kiểu con trỏ theo cú pháp:

(<Kiểu kết quả>*)<Tên con trỏ>  Chẳng hạn, ví dụ trên được viết lại:

int a, *p, *q ;

float *f;

a = 5 ; p = &a ; q = p ; /* đúng */

f = (float*)p; /* Đúng nhờ ép kiểu*/

Phép toán cộng và trừ trên con trỏ

  • Chỉ có thể thực hiện phép toán cộng và trừ trên con trỏ

int a=50;

int *pa;

pa = &a;

pa ++;

  • Giả sử biến a được lưu trữ tại địa chỉ 1000
  • pa lưu giá trị 1000. Vì số nguyên có kích thước là  2  bytes, nên sau biểu thức  “pa++;” pa sẽ có giá trị là 1002 mà không là 1001
++pa  hoặc pa++ Trỏ đến số nguyên kế tiếp đứng sau a
–pa  hoặc pa– Trỏ đến số nguyên kế tiếp đứng trước a
pa + i Trỏ đến số nguyên thứ i đứng sau a
pa – i Trỏ đến số nguyên thứ i đứng trước a
++*pa  hoặc (*pa)++ Sẽ tăng giá trị a  thêm 1 nếu pa đang trỏ đến a.
–*pa  hoặc (*pa)– Sẽ giảm giá trị a  bớt 1 nếu pa đang trỏ đến a.
*pa++ Sẽ tác động đến giá trị của số nguyên kế tiếp sau a
  • Mỗi lần con trỏ được tăng trị, nó trỏ đến ô nhớ của phần tử kế tiếp
  • Mỗi lần con trỏ được giảm trị, nó trỏ đến ô nhớ của phần tử đứng trước nó
  • Tất cả con trỏ sẽ tăng hoặc giảm trị theo kích thước của kiểu dữ liệu mà chúng đang trỏ đến

Cộng, trừ con trỏ với một số nguyên

Ta có thể cộng (+), trừ (-) 1 con trỏ với 1 số nguyên N nào đó; kết quả trả về là 1 con trỏ.

Con trỏ này chỉ đến vùng nhớ cách vùng nhớ của con trỏ hiện tại N phần tử.

Ví dụ: Cho đoạn chương trình sau:

int *pa; 

pa = (int*) malloc(20); /* Cấp phát vùng nhớ 20 byte=10 số nguyên*/ 

int *pb, *pc; 

pb = pa + 7;

pc = pb – 3; 

Lúc này hình ảnh của pa, pb, pc như sau:

0 1 2 3 4 5 6 7 8 9
pa pc pb

 

Lưu ý:

  • Ta không thể cộng 2 con trỏ với nhau;
  • Phép trừ 2 con trỏ cùng kiểu sẽ trả về 1 giá trị nguyên (int). Đây chính là khoảng cách (số phần tử) giữa 2 con trỏ đó. Chẳng hạn, trong ví dụ trên pc-pa=4.

So sánh con trỏ

  • Hai con trỏ có thể được so sánh trong một biểu thức quan hệ nếu chúng trỏ đến các biến có cùng kiểu dữ liệu
  • Giả sử ptr_a và ptr_b là hai biến con trỏ trỏ đến các phần tử dữ liệu a và b. Trong trường hợp này, các phép so sánh sau là có thể:

Sosanhcontro

Con trỏ NULL

là con trỏ không chứa địa chỉ nào cả. Ta có thể gán giá trị NULL cho 1 con trỏ có kiểu bất kỳ.

LEAVE A REPLY