为什么允许减法?可以减去两个地址,因为两个地址之间的内存将是有效内存。
假设存储器Ptr_1和ptr_2的有效地址。显然,这两个地址之间的内存是有效的。
指针ptr_1指向0x1cb0010的存储位置,而ptr_2指向0x1cb0030的存储位置。如果我们从ptr_2减去ptr_1,则Memory区域将位于这两个位置之间,这显然是有效的存储位置。
// C program to demonstrate that pointer
// subtraction is allowed.
#include
#include
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
为什么不允许加法,乘法,除法或模数?
如果我们对ptr_1和ptr_2执行加法,乘法,除法或模数运算,则结果地址可能是有效地址,也可能不是有效地址。可能超出范围或地址无效。这就是编译器不允许对有效地址进行这些操作的原因。
// C program to demonstrate addition / division
// / multiplication not allowed on pointers.
#include
#include
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);
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。