C言語では、変数に**を付けた、ポインタのポインタというものが可能であるという事を知ったのですが、実際に使ってみると、思ったような動作でなくて戸惑っています。
例えば、
C
1 char *mark[5] = { "cba","ed","ihgf","lkj","ponm" }; 2 char **pt; 3 pt = mark; 4 printf("%s\n", *pt);
この場合、画面にはcdaと表示されます。
ポインタのポインタに格納されたアドレスなので、markの先頭アドレスから文字数分表示されるというのは理解できます。
C
1 char *mark[5] = { "cba","ed","ihgf","lkj","ponm" }; 2 char **pt; 3 pt = mark; 4 printf("%s\n", *pt+1);
このようにすると、daと表示されます。
**ptがchar方なので、+1はchar1文字分進むというのは予想通りです。
これも理解できます。
C
1 char *mark[5] = { "cba","ed","ihgf","lkj","ponm" }; 2 char **pt; 3 pt = mark; 4 printf("%c\n", **pt);
このようにすると、cと表示されます。
ポインタのポインタの値なので、cbaの先頭アドレスのcが表示されているという事は理解できます。
理解できないのは次です。
C
1 char *mark[5] = { "cba","ed","ihgf","lkj","ponm" }; 2 char **pt; 3 pt = mark; 4 printf("%c\n", **pt+1);
+1しているので、てっきりcの次のbが表示されると思いきや、実際に実行数すると、配列2つめの2文字目であるdが表示されます。
先頭から5番目の文字、cの4バイト先の文字です。
C
1 char *mark[5] = { "cba","ed","ihgf","lkj","ponm" }; 2 char **pt; 3 pt = mark; 4 printf("%c\n", **pt+2);
さらにこのように+2にすると、eが表示されます。
配列2つめの1文字目です。
先頭のcから数えて3バイト先です。
+1の時からひとつ戻った形になります。
C
1 char *mark[5] = { "cba","ed","ihgf","lkj","ponm" }; 2 char **pt; 3 pt = mark; 4 printf("%c\n", **pt+3);
このように+3すると、今度はfが表示されます。
どうしてこのような動作になってしまうのでしょうか?
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/01/26 14:41