答え
この行が間違い!
pi += sizeof(int);
こう書くのが正解!
pi += 1;
または、これでもOKです!
pi++;
解説
これは、ポインタのインクリメントに関する出題でした。インクリメントとは、値を1つ増やすことです。今回のポインタは配列を指しているので、「配列内の次の要素に進む」ことを意味します。
ポインタを次の要素に進めるには、要素1つ分のサイズだけ値を増やさなければならないと考えがちです。でも、ポインタには型が指定されているので、1を足すだけで自動的にサイズが計算されるのです。
次のプログラムで、ポインタの動作を確認してみましょう。
test.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int numbers[] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
-1
};
int *pi = numbers;
printf("pi -> %d\n", *pi);
printf("pi + 1 -> %d\n", *(pi + 1));
printf("pi + sizeof(int) -> %d\n", *(pi + sizeof(int)));
return EXIT_SUCCESS;
}
実行結果
pi -> 1
pi + 1 -> 2
pi + sizeof(int) -> 5
ポインタに1を足すと、配列内の次の要素に進めるのが分かるでしょ。
あ、
sizeof(int)
を足したほうは4つ先の要素に進んでますよ!
それはね、今使ってるパソコンでは
int
のサイズが4バイトだってことね。
なるほど〜。
ここがポイント!
ポインタを配列内の次の要素に進めたいときは、1を足すだけでOK!
修正後のプログラム
main.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int numbers[] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
-1
};
int nSum = 0;
int *pi = numbers;
while (*pi != -1) {
nSum += *pi;
pi += 1; /* ← この行を修正 */
}
printf("Sum = %d\n", nSum);
return EXIT_SUCCESS;
}
実行結果
Sum = 55