Lập trình C – Phép toán trên con trỏ

Lập trình C

– Phép toán trên con trỏ

Bài trước

Bài sau

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.

Bài trước

Bài sau