2015-05-26 4 views
1

Я подозреваю, когда по причинам переносимости добавления указателей делает допущения, лежащие в отношении реализации, но может кто-то пожалуйста, объясните, почему под MinGW GCC я не могу сделать следующее, из-за следующей ошибкиДобавление указателей на обугливает

«недействительных операнды бинарной + (имеют char *char * и)»

char *cbase; 
char *ep; 
char *tbase; 
tbase = ep + tbase; 

Тем не менее, если я немного манипулировать код, который я могу уйти с

char *cbase; 
char *ep; 
int temp; 

temp = cbase; 
tbase = ep + temp; 

Я знаю, что я делаю некоторые предположения относительно реализации указателя, но мой вопрос в том, почему компилятор не может решить это для меня?

ответ

3

TL; DR - Вы не можете добавить два указателя.

Указатель (и) - (-ы) адрес (-ы) памяти. Подумайте на мгновение, даже если вы бы были разрешено добавить два указателя, каково значение результата? Он будет производить в основном a недействительный значение, не так ли?

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

Кроме того, от стандарта C11, глава §6.5.6, Аддитивные операторы (курсив мой)

Для того, либо оба операнда имеют арифметический тип, или один операнд должен быть указатель на полный тип объекта, а другой должен иметь целочисленный тип. (Инкрементирование это эквивалентно добавлению 1.)

+0

Thankyou. Я переношу старое приложение Small C, поэтому кажется, что стандарты немного изменились с 80-х годов. Возможно, я достигаю того, чего хочу, используя и int для хранения адреса, но теперь я понимаю стандарт. –

+1

Да, ваша точка зрения относительно неправильного характера кода верна. Оригинальный автор использовал указатели как целые числа без знака из-за ограничений, если небольшой компилятор c. –

+0

@Alex Добро пожаловать. :-) Кстати, вы можете рассмотреть [принятие] (http: //meta.stackexchange.com/q/5234) ответ, который помог вам. –

0

Добавление двух указателей, скорее всего, генерировать и неверный указатель и, следовательно, это не разрешено, но добавление целого числа к указателю вполне допустимо, это увеличит указатель, т.е. полученный указатель, скорее всего, будет действителен, если вы не добавите значение, которое заставляет его указывать за пределами блока памяти, на который он указывал первоначально.

Вы не можете добавлять указатели, но вы можете вычислить разницу указателей, они будут как расстояния, например

char *source = "Some text for a test"; 
char *head = strstr(source, "text"); 
char *tail = strstr(source, "for"); 
size_t length = tail - head - 1; 

даст вам длину text, так что вы можете вычислить разницу указателей.

+0

Спасибо iharob - это умно. Я могу использовать это, и это решит мою проблему. –

+0

@Alan существует даже специальный тип для указателей различий 'ptrdiff_t'. –

+0

Я не могу слишком сильно отклониться от небольшого языка C, если я не добавлю библиотечные функции, поскольку мне нужно скомпилировать компилятор, но я хотел бы оставаться рядом со стандартами, поэтому сначала нужно перенести на MinGW GCC. –