Самый чистый способ выполнения арифметики с указателями - это не числа байтов, а строго типизированный. Не относитесь к массиву int
как к чему-то другому, просто смещайте напрямую:
int* next = foo + n;
или
int* next = &foo[n];
Оба превосходят ваше решение для литья.
В тех случаях, когда вы работаете с байтовым буфером, используйте char*
, а не (никогда!) int*
. То есть
char* buffer = get_the_buffer();
// Pointer arithmetic uses sizeof(char) == 1
Если вам действительно нужно постепенно увеличивать байты внутри небайтового массива, сначала спросите себя, какого черта вы это делаете. Затем приведите к char*
и сделайте арифметику указателя; делать не приведение к int
или другие целочисленные типы:
char* foo_buffer = reinterpret_cast<char*>(foo);
char* whatever = foo_buffer + n;
Вместо char
вы также можете использовать unsigned char
, что, возможно, имеет больше смысла для представления байтов, но не влияет на арифметику указателей. Однако будьте осторожны с выравниванием: вы больше не можете надежно обращаться к увеличенному указателю, используя исходный тип. Это строго неопределенное поведение (= плохо !) Для доступа к невыровненной памяти. В лучших случаях это медленно. В худшем случае вылетает.
Само собой разумеется, что все это крайне низкий уровень. Такого кода больше почти нет. Даже низкоуровневые библиотеки должны предпочитать использовать стандартные библиотеки C ++ для такого рода кода, и в частности, арифметика указателей имеет все меньшее и меньшее использование.