There are 2 ways to say don't change the signature:
1) don't change it at all, period, hard lock.
2) it needs to work with older / existing code, if you modify it you can't break anything.
1, there isnt much to do about.
2, for example, if you had
void foo(int x);
you can make it
void foo(int x, int y=42); //calling it with 1 parameter still works for old code. if y is 42 you know its an old call and can do something special or whatever.
in that regard,
int insert(char*& str1, char* str2, size_t n)
this can be called by the existing code without problems, but I DID change it. This small change lets you change the *pointer* str1 (delete and replace it). Whether this is useful to you now or not... probably not. And if you have arrays passed in as well as raw pointers, it would not go well if you tried to change an array's pointer.