You always need to check array bounds in C, what else is new?
For example, the char pointer increment compiles to:
4004fb: 48 83 c0 01 add $0x1,%rax
While an int pointer increment compiles to: 40050c: 48 83 c0 04 add $0x4,%rax
Because on my particular platform, an int is 4 bytes and a char is 1 byte and the memory is byte addressable.