趣味の開発ノート

ITの学習やプログラミング・ノーコードアプリ開発のことなど。

【C言語】ポインタと関数を使ったコードについてまとめ

プログラミングの幅を広げようとC言語の学習をしていて、現在はポインタ周りをじっくりと学習している。

nouka-it.hatenablog.com

今日は、関数におけるポインタの活用について、具体的なコードで整理してみる。
特に以下のような処理行うときの記述を見ていく。

  • 呼び出し先の関数で、数値(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