Lập trình C - Phép toán trên con trỏ
Các phép toán trên con trỏ
Về mặt bản chất, giá trị lưu trữ bên trong vùng nhớ của con trỏ là địa chỉ, địa chỉ của một biến (hoặc vùng nhớ) có kiểu unsigned int (số nguyên không dấu), do đó, chúng ta có thể thực hiện các phép toán trên con trỏ. Nhưng kết quả của các phép toán thực hiện trên con trỏ sẽ khác các phép toán số học thông thường về giá trị và cả ý nghĩa.
Ngôn ngữ C/C++ định nghĩa cho chúng ta 4 toán tử toán học có thể sử dụng cho con trỏ: ++, --, +, và -.
Increment operator (++)
Như các bạn đã được học, increment operator (++) được dùng để tăng giá trị bên trong vùng nhớ của biến lên 1 đơn vị. Increment operator (++) là toán tử một ngôi, có thể đặt trước tên biến, hoặc đặt sau tên biến
Công thức
new_address= current_address + i * size_of(data type)
32 bit
Win 32 bit biến số nguyên sẽ tăng lên 2 byte.
64 bit
Win 64 bit biến số nguyên sẽ tăng lên 4 byte.
Ví dụ tăng biến con trỏ nguyên tăng lên 1 trên win 64 bit
#include<stdio.h>
int main(){
int number=50;
int *p;//pointer to int
p=&number;//stores the address of number variable
printf("Address of p variable is %u \n",p);
p=p+1;
printf("After increment: Address of p variable is %u \n",p);
return 0;
}
Kết quả:
Address of p variable is 3214864300
After increment: Address of p variable is 3214864304
Decrement operator (--)
Ngược lại so với increment operator (++), decrement operator (--) sẽ giảm giá trị bên trong vùng nhớ của biến thông thường đi 1 đơn vị. Đối với biến con trỏ, khi sử dụng decrement operator (--), nó sẽ làm thay đổi địa chỉ của con trỏ đang trỏ đến, giá trị địa chỉ mới sẽ bằng giá trị địa chỉ cũ trừ đi kích thước của kiểu dữ liệu mà con trỏ đang trỏ đến.
Công thức tính:
new_address= current_address - i * size_of(data type)
32 bit
Win 32 bit biến số nguyên sẽ giảm lên 2 byte.
64 bit
Win 64 bit biến số nguyên sẽ giảm lên 4 byte.
Ví dụ tăng biến con trỏ nguyên giảm đi 1 trên win 64 bit
#include <stdio.h>
void main(){
int number=50;
int *p;//pointer to int
p=&number;//stores the address of number variable
printf("Address of p variable is %u \n",p);
p=p-1;
printf("After decrement: Address of p variable is %u \n",p);
}
Kết quả:
Address of p variable is 3214864300
After decrement: Address of p variable is 3214864296
Phép toán cộng con trỏ trong C
Sử dụng increment operator (++) cho con trỏ chỉ có thể làm con trỏ trỏ đến địa chỉ tiếp theo trên bộ nhớ ảo bắt đầu từ địa chỉ ban đầu mà con trỏ đang nắm giữ. Trong khi đó, toán tử addition (+) cho phép chúng ta trỏ đến vùng nhớ bất kỳ phía sau địa chỉ mà con trỏ đang nắm giữ.
new_address= current_address + (number * size_of(data type))
32 bit
Win 32 bit biến số nguyên sẽ được cộng thêm 2 * number.
64 bit
Win 64 bit biến số nguyên sẽ được cộng thêm 4 * number.
Ví dụ cộng thêm giá trị cho con trỏ trên win 64 bit
#include<stdio.h>
int main(){
int number=50;
int *p;//pointer to int
p=&number;//stores the address of number variable
printf("Address of p variable is %u \n",p);
p=p+3; //subtracting 3 from pointer variable
printf("After subtracting 3: Address of p variable is %u \n",p);
return 0;
}
Kết quả:
Address of p variable is 3214864300
After adding 3: Address of p variable is 3214864312
Địa chỉ của p là 3214864300. Nhưng sau khi cộng thêm 3 cho biến p sẽ là 3214864312 vì 4*3=12 tăng thêm 12. Bởi vì, ví dụ đang sử dụng Win 64 bit. Nhưng nếu chúng ta sử dụng Win 32 bit, nó chỉ tăng 6, Vì 2*3=6 . Giá trị số nguyên sẽ chiếm lấy 2 byte bộ nhớ trong Win 32 bit.
Phép toán trừ con trỏ trong C
C Pointer Subtraction
Giống như phép toán cộng, chúng ta có thể trừ giá trị từ biến con trỏ. Công thức tính:
new_address= current_address - (number * size_of(data type))
32 bit
Win 32 bit biến số nguyên sẽ được giảm thêm 2 * number.
64 bit
Win 64 bit biến số nguyên sẽ được giảm thêm 4 * number.
Ví dụ trừ giá trị cho con trỏ trên win 64 bit
#include<stdio.h>
int main(){
int number=50;
int *p;//pointer to int
p=&number;//stores the address of number variable
printf("Address of p variable is %u \n",p);
p=p-3; //subtracting 3 from pointer variable
printf("After subtracting 3: Address of p variable is %u \n",p);
return 0;
}
Kết quả:
Address of p variable is 3214864300
After subtracting 3: Address of p variable is 3214864288
Sau khi trừ giá trị 3 từ biến con trỏ, nó sẽ giảm đi (3*4) =12 từ giá trị ban đầu.