プログラミングの幅を広げようとC言語の学習をしていて、現在はポインタ周りをじっくりと学習している。
今日は、関数におけるポインタの活用について、具体的なコードで整理してみる。
特に以下のような処理行うときの記述を見ていく。
- 呼び出し先の関数で、数値(int型変数)を演算して直接元の値を変更する
- 呼び出し先の関数に、文字列(char型変数)を渡して表示させる
この辺は「値渡し」「参照渡し」というキーワードとも通じるところなので、整理しておきたい。
ポイント整理
(1)変数と文字列変数の定義
変数定義の基本的な書き方。
- int型、char型文字列を定義する。
char hero[] = "しゅじんこう"; // (1-2)文字列変数の定義 int hero_attack = 2; // (1-1)変数の定義 int opponent_hp = 10;
(2)関数定義
関数定義時の書き方。
- ただ値を渡したい場合は、関数の仮引数に変数名を指定する。
- 文字列を渡したり、値を渡して呼び出し先で直接書き換えたりしたい場合は、関数の仮引数にポインタ型を指定する。
- 変数名に
*
をつける(定義時のアスタリスク)
void Attack(int attack, int *hp, char *attacker); // (2)関数定義
(3)関数を呼び出す命令
呼び出し元で、関数にポインタを渡す時の書き方。
- 変数名に
&
をつけることでポインタを示す(アドレス演算子)
Attack(hero_attack, &opponent_hp, hero); // (3)
(4)関数呼び出し先での変数の扱い
呼び出し先でポインタを受け取って処理する時の書き方。
- 値を直接変更する場合は、変数名に
*
をつけて演算を行う(間接参照演算子) - 文字列を表示する場合は、配列変数名をそのまま利用する
*hp -= attack; // (4-1)関数呼び出し先で直接値を変更する printf("(Attack関数)%s の こうげき\n\n", attacker); // (4-2)関数呼び出し先で文字列を表示する
「値渡し」と「参照渡し」
今後まとめる。
サンプルコード
#include <stdio.h> /* プロトタイプ宣言 */ void Attack(int attack, int *hp, char *attacker); // (2)関数定義 int main() { char hero[] = "しゅじんこう"; // (1-2)文字列変数の定義 int hero_attack = 2; // (1-1)変数の定義 int opponent_hp = 10; printf("%s のターン\n", hero); printf("最初の hp = %d\n\n", opponent_hp); Attack(hero_attack, &opponent_hp, hero); // (3)関数を呼び出す命令 printf("アタック後の hp = %d\n", opponent_hp); return 0; } void Attack(int attack, int *hp, char *attacker) { *hp -= attack; // (4-1)関数呼び出し先で直接値を変更する printf("(Attack関数)%s の こうげき\n\n", attacker); // (4-2)関数呼び出し先で文字列を表示する };
▼出力結果
しゅじんこう のターン 最初の hp = 10 (Attack関数)しゅじんこう の こうげき アタック後の hp = 8