C   関数

ホーム   C/C++チュートリアル


この章ではCの関数、型、変数、ポインターを説明します。

関数

function.c


#include <stdio.h>

void func()
{
    printf("I am a function.\n");
}

int main()
{
    func();
    return 0;
}
    

実行結果


I am function.
    

コード説明


関数の前方宣言

function.c


#include <stdio.h>

void func();    // 関数の前方宣言

int main()
{
    func();
    return 0;
}

void func()     // 関数の実際の定義は、関数の呼び出しよりも後で記述しています
{
    printf("I am a function.\n");
}
    


識別子の命名規則


引数

parameter.c

#include <stdio.h>

int sum(int a, int b);

int main()
{
    printf("%d\n", sum(5, 5));
    return 0;
}

int sum(int a, int b)
{
    return a + b;
}
    

実行結果


10
    

コード説明


int sum(int a, int b);
    

    printf("%d\n", sum(5, 5));
    

    return a + b;
    



ポインター

pointer.c


#include <stdio.h>

int main()
{
    int  num = 100;
    int *ptr = &num;
    
    printf("%d\n", num);
    printf("%p\n", ptr);
    printf("%d\n", *ptr);
    printf("%p\n", &num);
    
    num = 200;
    
    printf("%d\n", num);
    printf("%d\n", *ptr);
    printf("%p\n", ptr);
    printf("%p\n", &num);
    
    return 0;
}    

実行結果


100
0x7ffee7682b58
100
0x7ffee7682b58
200
200
0x7ffee7682b58
0x7ffee7682b58
    

コード説明


    int  num = 100;
    int *ptr = &num;
    
  1. ポインターを定義するには、変数名の前に * (アスタリスク)をつけます。
  2. 普通の変数のアドレスを取得するには、その変数の前に & (アンバサンド) をつけます。
  3. ある型のポインターは、そのポインターと同じ型の変数のアドレスしか代入できません。

    printf("%p\n", ptr);
    printf("%d\n", *ptr);
    
  1. ポインターの値(16進数のアドレス)を取得するには、 ポインター名をそのまま記述します。その場合の変換指定子は %p です。 ポインター(Pointer)略だと思えば覚えやすいでしょう。
  2. ポインターが指し示すアドレスに入っている値を取得するには、 ポインター名の前に * をつけます。

    num = 200;
    ・・・
    printf("%p\n", ptr);
    
  1. num 変数の値を変更しても、そのポインターが表すアドレスは変わりません。


値渡しと参照渡し

byreference.cpp


#include <stdio.h>

int  plus100(int  a);
void plus200(int *a);

int main()
{
    int a = 100;
    a = plus100(a);
    
    printf("%d\n", a);
    
    plus200(&a);
    
    printf("%d\n", a);
    
    return 0;
}

int  plus100(int a)
{
    return a + 100;
}

void plus200(int *a)
{
    *a = *a + 200;
}
    

実行結果


200
400
    

コード説明

  1. plus100( )関数では、aの値のコピーが引数として渡されます。 aが直接渡されているわけではありません。 したがってplus100( )関数の中で、引数として渡されたデータを加工しても、 main 関数の中の a の値は変わりません。 このような引数の渡し方を値渡しと言います。
  2. 「引数」の項で、引数を受け取った関数は、引数の名前をその値として使える と説明ましたが、正確には 受け取った引数を変数として使えるということになります。 しかし、引数を値渡しで受け取った場合は、引数を受け取った関数側で、 その値をいくら加工しても、関数を呼び出した側の値は変わりません。
  3. 一方、plus200( )関数では、aのアドレス(ポインター)が引数として渡されています。 plus200( )関数の中では、ポインターをたどって main( )関数の中の a の値を直接加工することができます。このような引数の渡し方を参照渡しと言います。


ポインターが必要になる理由


main( )関数の引数

mainarg.c


#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("%d\n", argc);
    printf("%s\n", argv[0]);
    
    return 0;
}
    

実行結果


1
./a.out
    

コード説明


23275 visits
Posted: Dec. 22, 2019
Update: Dec. 23, 2019

ホーム   C/C++チュートリアル   目次