今回は、「ポインタと配列の相違点」をご紹介しよう。
int *p;
int a[5];
p = a;
このコードでは、intへのポインタpに代入されているのは、aすなわち&a[ 0 ]である。
この結果、ポインタpはa[ 0 ]を指す。
int x[5];
int a[5];
x = a //エラー
代入x = aの右オペランドは、aであるが、左オペランドは配列xである。
この代入はエラーとなる。これは試さないでいただきたい。
代入演算子の左オペランドを配列とすることはできない。
したがって、配列を全要素を別の配列にコピーする際は、次のようなプログラムになる。
なお、本プログラムは、Windows 11 Home(23H2)上で、 Visual Studio Code(1.90.0)を使用して作成し、gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0でコンパイルしている。
配列の全要素を別の配列にコピーするプログラム
//配列の全要素を別の配列にコピーするプログラム
#include <stdio.h>
int main(void)
{
int a[5];
int b[5];
for (int i = 0; i < 5; i++)
{
printf("a[%d]:",i); //要素に値を読み込む
scanf("%d",&a[i]);
}
for (int i = 0; i < 5; i++)
b[i] = a[i];
puts(" a b");
puts("-----------");
for (int i = 0; i < 5; i++)
printf("%4d%4d\n",a[i],b[i]);
return 0;
}
実行結果
a[0]:16
a[1]:43
a[2]:67
a[3]:78
a[4]:86
a b
-----------
16 16
43 43
67 67
78 78
86 86
代入演算子によって、配列を代入することはできない。
↓
すなわち、代入演算子によって、配列の先頭要素へのポインタを変更することはできない。
したがって、コピーは、繰り返し文などを用いた全要素の逐一代入によって行う。
(参考) 新・明解C言語 入門編 第2版 柴田 望洋 (著)SBクリエイティブ
コメント