質問への回答でなくて申し訳ありませんが、
ポインタを使った文字列の反転です。
C
1#include <stdio.h>
2
3char *revstr(char *s, char *p)
4{
5 char c = *p;
6 return c ? p = revstr(s, p + 1), *p = c, p + 1 : s;
7}
8
9int main(void)
10{
11 char v[11] = "HelloWorld";
12 printf("v = %s\n", v);
13 revstr(v, v);
14 printf("v = %s\n", v);
15}
追記
3項演算子 ?: を使わずに書くと次のようになります。
C
1#include <stdio.h>
2
3char *revstr(char *s, char *p)
4{
5 char c = *p;
6 if (c != '\0') {
7 p = revstr(s, p + 1);
8 *p = c;
9 return p + 1;
10 }
11 else
12 return s;
13}
14
15int main(void)
16{
17 char v[11] = "HelloWorld";
18 printf("v = %s\n", v);
19 revstr(v, v);
20 printf("v = %s\n", v);
21}
s は変化せず、常に main の v[0] を指すポインタです。
p は、関数 revstr の再帰呼出しにより、配列 v の要素を順番に指していきます。
最初に呼び出された revstr の c には 'H' が入ります。
2番目に呼び出された revstr の c には 'e' が入ります。
...
9番目に呼び出された revstr の c には 'l' が入ります。
10番目に呼び出された revstr の c には 'd' が入ります。
11番目に呼び出された revstr の c には '\0' が入ります。
ここで c が '\0' なので、再帰呼出しはせずに、s を返し、
10番目に呼び出された revstr に戻ります。
そこで p には s の値、すなわち v[0] のアドレスが入るので、
*p = c; により、v[0] に 'd' が入ります。
そして、p + 1、すなわち v[1] のアドレスを返します。
9番目に呼び出された revstr に戻ると、p に v[1] のアドレスが入ります。
*p = c; により、v[1] に 'l' が入ります。
そして、p + 1、すなわち v[1] へのアドレスを返します。
これを繰り返して、最初に呼び出された revstr に戻った時
p には v[9] のアドレスが入ります。
*p = c; により、v[9] に 'H' が入ります。
そして、main に戻ります。
追記その2
char v[] = ""; でも未定義動作ではないプログラム
C
1#include <stdio.h> // printf
2#include <string.h> // strlen
3
4int main(void)
5{
6 char v[] = "HelloWorld";
7 char *p = v;
8 char *q = v + strlen(v);
9 printf("v = %s\n", v);
10 while (p + 1 < q) {
11 char temp = *p;
12 *p++ = *--q;
13 *q = temp;
14 }
15 printf("v = %s\n", v);
16}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/04 11:57
2019/10/04 12:00
2019/10/06 10:56
2019/10/06 11:29
2019/10/07 02:57
2019/10/07 06:40 編集
2019/10/07 06:50
2019/10/07 07:29