プログラミング学習日記

プログラミング学習時のメモ帳。

引数に配列を持たせる

間違っている場所あったら優しく教えてね

配列とポインタ

c言語で関数の引数にポインタを持たせる

#include <stdio.h>

//配列vの先頭n個にvalを代入する
void array_set(int v[], int n, int val)
{
    int i;
    for (i = 0; i < n; i++)
    {
        v[i] = val;
    }
    //printf("%lu\n", sizeof(v));
    return;
}

int main(void)
{
    int i;
    int a[] = {1,
               2,
               3,
               4,
               5};
    printf("%lu\n", sizeof(a));
    array_set(a, 3, 99);
    for (i = 0; i < 5; i++)
    {
        printf("a[%d] = %2d\n", i, a[i]);
    }

    return 0;
}

関数の引数に配列を持たせると配列のポインタが渡されることになる,

int a[] = {1,2,3,4,5};
int *p = a;

このように書いた際のpが引数として渡されることになる. そのためsizeof(v)はエラーとして表示される.
このことを考えて

for(i = 0;i < n;i++){
  v[i] = val;
}

この部分を変更してみる.

1

for(i = 0;i  < n;i ++){
  *(v + i) = val;
}

2

for(i = 0;i  < n;i ++){
  *(v + i) = val;
}

3

for(i = 0;i  < n;i ++){
  *v = val;
  v++;
}

4

for(i = 0;i  < n;i ++){
  *v++ = val;
}

5

for(i = 0;i  < n;i ++){
  i[v] = val;
}

方法は様々あるがどれも同じ挙動を示している. しかし注意が必要なのが, array_set関数の中でfor文を回してループした後にvのポインタのさす場所が変わっているものがある. vは最初配列の一番最初の要素の位置を表していたがv++などの操作を行ってしまうとvのポインタ先のアドレスが変わってしまっています. その後vを使う処理を関数内で行うとしたら注意が必要です.

i[v]なんて気持ち悪い書き方使わないようにしよう

ブログを見ていただきありがとうございました