Причина, по которой он хрупок, заключается в том, что вы обходите стороной все, что он делает, чтобы защитить вас. Пока вы не наберетесь достаточного опыта, чтобы понять, почему возникают эти проблемы и как их избежать, вам следует:
- Забудьте, что
printf
существует. Вместо этого используйте std::cout
.
- Забудьте, что
new
существует. Вместо этого используйте std::vector
.
Вероятно, вам также следует прочитать FAQ по C ++ и обратить пристальное внимание на часть, в которой говорится что-то вроде: «Даже если X - это Y, массив X не является массивом Y».
Редактировать: Относительно того, почему вы видите поведение, которое вы видите, все довольно просто: арифметика указателей определяется в терминах статического типа, а не динамического типа. Это означает, что он полностью основан на типе указателя, который вы определили для указателя, а не на то, на что он указывает. Если вы говорите, что он указывает на A, но затем указывает на B, арифметика все равно будет выполняться так, как если бы она указывала на A, как вы сказали.