📜  为什么只允许地址减法而不允许除法/加法/乘法

📅  最后修改于: 2021-05-25 21:01:09             🧑  作者: Mango

为什么允许减法?可以减去两个地址,因为两个地址之间的内存将是有效内存。
假设存储器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基础课程》。