第01問の答え

答え

この行が間違い!
    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