[C言語] 配列のポインタに別の配列を代入できる?
C言語では、配列そのものを別の配列に直接代入することはできません。しかし、配列の先頭要素のアドレスを指すポインタを使用することで、配列の内容を操作することが可能です。
配列の名前はそのまま配列の先頭要素のアドレスを示すポインタとして扱われます。したがって、ポインタを使って別の配列の内容を参照したり、コピーしたりすることができます。
この方法を用いることで、配列の要素を効率的に操作することが可能です。
配列のポインタに別の配列を代入する方法
配列のポインタに別の配列を代入できるか
C言語では、配列そのものを別の配列に直接代入することはできません。
しかし、配列の先頭アドレスを指すポインタを使うことで、配列の内容を操作することが可能です。
ポインタを使うことで、配列の要素を間接的に操作したり、関数に配列を渡したりすることができます。
ポインタを使った配列の代入方法
配列のポインタを使って別の配列に代入するには、ポインタを利用して配列の要素を一つずつコピーする必要があります。
以下にその方法を示します。
#include <stdio.h>
int main() {
// 元の配列
int array1[] = {1, 2, 3, 4, 5};
// コピー先の配列
int array2[5];
// ポインタを使って配列をコピー
int *ptr1 = array1;
int *ptr2 = array2;
for (int i = 0; i < 5; i++) {
*(ptr2 + i) = *(ptr1 + i);
}
// コピー結果を表示
for (int i = 0; i < 5; i++) {
printf("%d ", array2[i]);
}
return 0;
}
1 2 3 4 5
このコードでは、array1
の要素をarray2
にコピーしています。
ポインタを使うことで、配列の要素を一つずつ操作することが可能です。
配列のコピーとポインタの違い
配列のコピーとポインタを使った操作にはいくつかの違いがあります。
以下の表にその違いを示します。
項目 | 配列のコピー | ポインタを使った操作 |
---|---|---|
メモリ使用 | 新しいメモリ領域が必要 | 既存のメモリ領域を使用 |
操作の柔軟性 | 固定されたサイズの配列をコピー | 任意のサイズや部分的な操作が可能 |
パフォーマンス | 大きな配列では時間がかかることがある | ポインタ操作は高速 |
ポインタを使った配列の操作例
ポインタを使うことで、配列の要素を動的に操作することができます。
以下に、ポインタを使った配列の操作例を示します。
#include <stdio.h>
void incrementArray(int *array, int size) {
for (int i = 0; i < size; i++) {
*(array + i) += 1; // 各要素を1増やす
}
}
int main() {
int numbers[] = {10, 20, 30, 40, 50};
int size = sizeof(numbers) / sizeof(numbers[0]);
incrementArray(numbers, size);
for (int i = 0; i < size; i++) {
printf("%d ", numbers[i]);
}
return 0;
}
11 21 31 41 51
この例では、incrementArray関数
を使って配列の各要素を1ずつ増やしています。
ポインタを使うことで、関数内で配列の要素を直接操作することができます。
配列のポインタを使った応用例
2次元配列のポインタ操作
2次元配列は、配列の配列として扱われます。
ポインタを使って2次元配列を操作することで、柔軟なデータ操作が可能です。
以下に2次元配列のポインタ操作の例を示します。
#include <stdio.h>
int main() {
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
int (*ptr)[3] = matrix; // 2次元配列のポインタ
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", ptr[i][j]);
}
printf("\n");
}
return 0;
}
1 2 3
4 5 6
このコードでは、2次元配列matrix
の要素をポインタptr
を使って出力しています。
関数への配列のポインタ渡し
配列を関数に渡す際、ポインタを使うことで配列の先頭アドレスを渡すことができます。
これにより、関数内で配列を操作することが可能です。
#include <stdio.h>
void printArray(int *array, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
int main() {
int data[] = {10, 20, 30, 40, 50};
int size = sizeof(data) / sizeof(data[0]);
printArray(data, size);
return 0;
}
10 20 30 40 50
この例では、printArray関数
に配列data
のポインタを渡し、関数内で配列の要素を出力しています。
動的配列とポインタの活用
動的配列は、実行時に必要なメモリを確保することで、柔軟にサイズを変更できます。
ポインタを使って動的配列を操作する方法を示します。
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 5;
int *dynamicArray = (int *)malloc(n * sizeof(int)); // メモリを動的に確保
for (int i = 0; i < n; i++) {
dynamicArray[i] = i * 10;
}
for (int i = 0; i < n; i++) {
printf("%d ", dynamicArray[i]);
}
printf("\n");
free(dynamicArray); // メモリを解放
return 0;
}
0 10 20 30 40
このコードでは、malloc
を使って動的にメモリを確保し、配列の要素を操作しています。
ポインタを使った配列のソート
ポインタを使って配列をソートすることも可能です。
以下に、バブルソートを用いた例を示します。
#include <stdio.h>
void bubbleSort(int *array, int size) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
int main() {
int numbers[] = {64, 34, 25, 12, 22, 11, 90};
int size = sizeof(numbers) / sizeof(numbers[0]);
bubbleSort(numbers, size);
for (int i = 0; i < size; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
return 0;
}
11 12 22 25 34 64 90
この例では、bubbleSort関数
を使って配列numbers
を昇順にソートしています。
配列のポインタを使った文字列操作
文字列は文字の配列として扱われます。
ポインタを使って文字列を操作することで、文字列の内容を変更したり、表示したりすることができます。
#include <stdio.h>
void toUpperCase(char *str) {
while (*str) {
if (*str >= 'a' && *str <= 'z') {
*str = *str - ('a' - 'A');
}
str++;
}
}
int main() {
char text[] = "hello, world!";
toUpperCase(text);
printf("%s\n", text);
return 0;
}
HELLO, WORLD!
このコードでは、toUpperCase関数
を使って文字列text
を大文字に変換しています。
ポインタを使うことで、文字列の各文字を直接操作することができます。
まとめ
配列のポインタを使うことで、C言語における配列操作がより柔軟で効率的になります。
この記事では、配列のポインタの基本的な使い方から応用例までを解説しました。
これを機に、ポインタを活用したプログラミングに挑戦してみてください。