Why Subtraction is allowed? Two addresses can be subtracted because the memory between the two addresses will be valid memory.
Let’s assume memory Ptr_1 and ptr_2 valid addresses. It is obvious that memory between these two addresses is valid.
Pointer ptr_1 is pointing to 0x1cb0010 memory location and ptr_2 is pointing to 0x1cb0030 memory location. If we subtract ptr_1 from ptr_2, then the Memory region will lie in between these two location which is obviously a valid memory location.
C++
#include <iostream>
using namespace std;
int main()
{
int * ptr_1 = ( int *) malloc ( sizeof ( int ));
int * ptr_2 = ( int *) malloc ( sizeof ( int ));
cout << "ptr_1:" << ptr_1 << " ptr_2: " << ptr_2 << endl;
cout << "Difference: " << ptr_2 - ptr_1;
free (ptr_1);
free (ptr_2);
return 0;
}
|
C
#include <stdio.h>
#include <stdlib.h>
int main()
{
int * ptr_1 = ( int *) malloc ( sizeof ( int ));
int * ptr_2 = ( int *) malloc ( sizeof ( int ));
printf ( "ptr_1: %p ptr_2: %p\n" , ptr_1, ptr_2);
printf ( "Difference: %lu" , ptr_2 - ptr_1);
free (ptr_1);
free (ptr_2);
return 0;
}
|
Output:
ptr_1: 0x1cb0010 ptr_2: 0x1cb0030
Difference: 8
Why addition, Multiplication, division or modulus is not allowed??
If we perform addition, multiplication, division or modulus on ptr_1 and ptr_2, then the resultant address may or may not be a valid address. That can be out of range or invalid address. This is the reason compiler doesn’t allow these operations on valid addresses.
C++
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
int * ptr_1 = ( int *) malloc ( sizeof ( int ));
int * ptr_2 = ( int *) malloc ( sizeof ( int ));
cout << "addition:%lu multipicaion:%lu division:%lu\n" <<
ptr_2 + ptr_1<< ptr_2 * ptr_1<< ptr_2 / ptr_1;
free (ptr_1);
free (ptr_2);
return 0;
}
|
C
#include <stdio.h>
#include <stdlib.h>
int main()
{
int * ptr_1 = ( int *) malloc ( sizeof ( int ));
int * ptr_2 = ( int *) malloc ( sizeof ( int ));
printf ( "addition:%lu multipicaion:%lu division:%lu\n" ,
ptr_2 + ptr_1, ptr_2 * ptr_1, ptr_2 / ptr_1);
free (ptr_1);
free (ptr_2);
return 0;
}
|
Output: prog.c: In function 'main':
prog.c:8:60: error: invalid operands to
binary + (have 'int *' and 'int *')
printf("addition:%lu multipicaion:%lu
division:%lu\n", ptr_2+ptr_1, ptr_2*ptr_1,
ptr_2/ptr_1);
Contact Us