Обратите внимание, что ваши первые три объявления фактически одинаковы, даже если SDL_Rect является typedef (потому что ключевое слово const никогда не "проникает" в typedef, как я бы хотел это выразить).
Ключевое слово const действует по-разному в разных местах. В этом случае он просто дает (отзывное) обещание, что check_collision не изменит и не заменит * A (ни A [i] для любого i), ни * B (ни B [j] для любого j). Однако, возможно, что A [i] и / или B [i] модифицируются любой функцией, которую вызывает ваш код, потому что базовые объекты могут быть модифицируемыми, и некоторые другие функции могут знать, как получить к ним доступ. Ключевое слово C99 «restrict» сообщает компилятору, что это не так, и предоставляет много возможностей для оптимизации; это обычно то, что вы хотите здесь.
C99 также добавляет новое использование для ключевого слова «static», чтобы включить определенные оптимизации во время компиляции, которые выходят за рамки тех, что предусмотрены «restrict». Они применяются только в том случае, если указатели указывают на первый элемент массивов, размер которого равен по крайней мере некоторому известному значению. (В основном это для векторизации.)
Как заметил @Als, лучше всего начинать с самого простого выражения «что вы имеете в виду» и добавлять ключевые слова для оптимизации только в том случае, если вы обнаружите, что программе отводится много времени в какой-то конкретной части (ях) программы.