square_sum.cpp

call_by_value.cpp

call_by_pointer.cpp

call_by_ref.cpp


繰り返し使う機能は “関数” としてまとめられる

#include <iostream>

using namespace std;

// 関数名だけ先に宣言
int square_sum(int n); // k = 1 から n まで k^2 を足し上げる

int main()
{
  int n = 5;
  cout << square_sum(n)	<< ' ' << n*(n+1)*(2*n+1)/6 << endl;

  n = 10;
  cout << square_sum(n) << ' ' << n*(n+1)*(2*n+1)/6 << endl;
}

int square_sum(int n) {
  int square_sum = 0; // 関数名と同名の変数も定義できる

  for (int k = 1; k <= n; k++) {
    square_sum += k*k;
  }

  return square_sum;
}

ポインタ

C における非常に重要 (で難解な) 概念。最近の C++ ではだいぶポインタを意識せずに書けるようになってきてる?

そもそも C では関数に変数を渡す際、変数そのものを渡すのではなく中の値をコピーして渡している (値渡し)。後述する “配列” などもそのまま渡すことはできない (中の値を一つずつ渡すことはできる)

Untitled

したがって関数 f に x を渡して f の中で x を書き換えてももとの x は変更されない

#include <iostream>

using	namespace std;

void f(double x) {
  cout << x << endl;
  x *= 5;
  cout << x << endl;
}

int main()
{
  double x = 2;
  cout << x << endl;
  f(x); // f の中で x を 5 倍しても外の x は変わらない
  cout << x << endl;
}
2
2
10
2

そこでポインタを使う。ポインタとは変数が保存されてるメモリの番地 (アドレス) を示す数値のこと。

Untitled

#include <iostream>

using	namespace std;

void f(double* p) { // ポインタ p を受け取る
  cout << *p << ' ' << p << endl; // p の指す変数 *p と p そのもの (アドレス) を表示
  *p *= 5; // p の指す変数を 5 倍
  cout << *p << endl;
}

int main()
{
  double x = 2;
  cout << x << ' ' << &x << endl; // x の値と "アドレス" を表示

  f(&x); // x の "アドレス" を渡す

  cout << x << endl; // main と f で共通の変数 x を操作したので値が変わる
}