Reverse a string recursively
swap would be is a nice general purpose swap routine. Notice that in your code you always call it with pos equal to 0. You should either drop this redundant parameter, or make swap even more general purpose by not assuming the semantics of the parameters, e.g.:

void swap(char * ptr1, char * prt2) {
    char ch = *ptr1;
    *ptr1 = * ptr2;
    *ptr2 = ch;
}


In this version, ptr1 and ptr2 do not have to belong to the same array.
recursive_mirror decrements length twice, and the first decrement has a side effect. The (non-existent) purpose of this side effect takes an effort to understand. A direct

  swap(arr, 0, length - 1);
  recursive_mirror(arr + 1, length - 2);


seems more readable).
The base case test can be if (length &lt; 2).

Nitpick: your base case tests fails miserably on a negative length. However, from the very beginning we know that length shall not be negative, so declaring it as an unsigned seems more prudent. At least the intention is documented.