繰り返し使う機能は “関数” としてまとめられる
#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 では関数に変数を渡す際、変数そのものを渡すのではなく中の値をコピーして渡している (値渡し)。後述する “配列” などもそのまま渡すことはできない (中の値を一つずつ渡すことはできる)
したがって関数 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
そこでポインタを使う。ポインタとは変数が保存されてるメモリの番地 (アドレス) を示す数値のこと。
#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 を操作したので値が変わる
}