Intereting Posts
C использованием scanf () для | строка с разделителями Почему определения структуры имеют внутреннюю связь? Как вычисляются поплавки на машине без FPU Прототип функции объявлен внутри основного – лучшая практика? преобразование uint8_t в строку ошибка compilin: поля должны иметь постоянный размер: расширение переменной длины массива в структуре никогда не будет поддерживаться в исходном коде Android 2.3.4 Как масштабировать число / диапазон чисел в c неопределенная ссылка на `getline ‘в c Что вы можете сделать в C без «std»? Являются ли они частью «С» или просто библиотек? Защита streamов данных только для чтения Является ли вилка (предположительно) безопасной от обработчиков сигналов в многопоточной программе? что такое segmentation fault (kernel сбрасывается)? Как получить АСТ от YACC? структура realloc с функцией в C Связать объектный файл с моим проектом Eclipse CDR

Вычитание адреса массива в C

Возможный дубликат:
Арифметика указателей в C

Код:

int main() { int a[ ] ={0,1,2,3,4}; char c[ ] = {'s','a','n','j','u'}; printf("%d\n",&a[3]-&a[0]); printf("%d\n",&c[3]-&c[0]); return 0; } 

Почему выход приходит 3 3 для обоих, если мы рассмотрим разницу в адресах, они будут разными для обоих?

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

Итак, поскольку разница в int s между a[3] и a[0] идентична разнице в char s между c[3] и c[0] – вы получите тот же результат для обоих.

Арифметика для операции вычитания указателей выглядит примерно так:

 type* p1 = ... type* p2 = ... p1 - p2 == (((int)p1) - (int(p2))) / sizeof(type)