Добавление двух указателей в c или С++ не поддерживается. Зачем?

Почему добавление двух указателей не поддерживается в c или С++.

Когда я это сделаю,

int *ptr,*ptr1;
int sum = ptr + ptr1;

C или С++ выдает ошибку. Хотя он поддерживает,

int diff = ptr - ptr1;

Ответ 1

Указатели содержат адреса. Добавление двух адресов не имеет смысла, потому что вы не представляете, что бы вы указали. Вычитание двух адресов позволяет вычислить смещение между этими двумя адресами, что может быть очень полезно в некоторых ситуациях.

Изменить: Чтобы решить общее желание найти середину, рассмотрим это (просто как пример):

#include <stdio.h>
int main (int argc, char **argv){
    int arr[] = {0,1,2,3,4,5,6,7,8,9};
    int *ptr_begin = arr;
    int *ptr_end = &arr[9];
    int *ptr_mid = ptr_begin + (ptr_end - ptr_begin)/2;
    printf("%d\n", *ptr_mid);
}

Я абсолютно уверен, что вы всегда можете придумать смещение-вычисление, которое позволяет делать то, что вы хотите достичь с добавлением.

Ответ 2

Иными словами, разница между двумя указателями дает количество элементов типа, которые могут быть сохранены между двумя указателями, но добавление их не дает каких-либо значимых функциональных возможностей. Если нет значимой функциональности, то не имеет смысла, что она не поддерживается.

Ответ 3

На самом деле может быть полезно добавление двух адресов. Возможно, вам нужно знать средний адрес между двумя адресами, например (a + b)/2 (для парня, который хочет думать о указателях как номеров домов, это даст ему номер дома посередине между двумя домами), я думаю, что добавление двух адресов должно быть разрешено, потому что вы можете сделать это в любом случае с помощью приведения:

int *ptr,*ptr1;
int sum = (int)ptr + (int)ptr1;

EDIT: Я не говорю, что использование добавочных адресов является обязательным в некоторых случаях, но может быть полезно, когда мы знаем, как его использовать.