Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語の配列とポインタの違いとは?基本からサンプルコードまで徹底解説

C言語において、配列は同じ型の複数の要素を連続的に格納するためのデータ構造です。一方、ポインタは変数のアドレス(メモリ上の場所)を保持するための特殊な変数です。

実は配列変数自体にもアドレスが存在するため、ポインタを使ってその先頭アドレスを指すことができます。さらに、ポインタ演算を利用すれば配列内の各要素を順番にたどることも可能です。

配列に対してポインタを使用するメリットは主に2つあります。1つ目は、動的に確保した配列のアドレスをポインタに格納できること、2つ目は、関数へ配列を渡す際にポインタを利用できることです。以下に、配列とポインタの主な違いをまとめます。

配列とポインタの主な違い

  • sizeof() 演算子: 配列に対して使用すると配列全体のサイズ(バイト数)が出力されますが、ポインタに対して使用するとポインタ自体のサイズ(多くの環境では int 型と同じサイズ)が出力されます。

  • 代入: 配列変数には他の変数のアドレスを代入できませんが、ポインタは任意の変数のアドレスを受け取ることができます。

  • 先頭要素へのアクセス: ポインタの値は配列の先頭要素の値と一致します。例えば、array[0] == *p という関係が成り立ちます。

  • 要素の走査: 配列は [](添字演算子)を使ってインデックスで要素にアクセスできます。一方、ポインタはポインタ演算によって配列の要素へアクセスできます。例えば、array[2] == *(p+2) という関係が成り立ちます。

サンプルコード(C)

#include <stdio.h>
void printElement(char* q, int index){
   printf("Element at index(%d) is: %c\n", index, *(q+index));
}
int main() {
   char arr[] = {'A', 'B', 'C'};
   char* p = arr;
   printf("Size of arr[]: %d\n", sizeof(arr));
   printf("Size of p: %d\n", sizeof(p));
   printf("First element using arr is: %c\n", arr[0]);
   printf("First element using p is: %c\n", *p);
   printf("Second element using arr is: %c\n", arr[1]);
   printf("Second element using p is: %c\n", *(p+1));
   printElement(p, 2);
   return 0;
}

実行結果

Size of arr[]: 3
Size of p: 8
First element using arr is: A
First element using p is: A
Second element using arr is: B
Second element using p is: B
Element at index(2) is: C

  1. Javaのパッケージとインターフェースの違いを徹底解説

    この記事では、Javaにおけるパッケージ(Package)とインターフェース(Interface)の違いについて詳しく解説します。どちらもJavaプログラミングにおいて重要な概念ですが、目的も使い方もまったく異なります。それぞれの特徴を理解し、適切に使い分けられるようにしましょう。 パッケージ(Package)とは パッケージは、関連性のあるクラスやインターフェースをひとつのグループとしてまとめるための仕組みです。大規模なプロジェクトでは、コードを機能ごとに整理することで可読性や保守性が大きく向上します。 関連するクラスやインターフェースをまとめたグループである packageキーワードを使

  2. GoとJavaの違いを徹底比較!特徴と使い分けのポイント

    プログラミング言語を選ぶ際、「Go」と「Java」のどちらを採用すべきか迷う開発者は少なくありません。どちらもGoogleや企業システムで広く使われる人気言語ですが、設計思想や言語仕様には大きな違いがあります。本記事では、それぞれの言語の特徴を解説したうえで、両者の主な違いを比較表を使ってわかりやすく整理します。 GoとはGoはGoogleが開発した手続き型(プロシージャル)プログラミング言語です。プログラムはパッケージ単位で構成され、シンプルで読みやすいコード記述を重視した設計になっています。動的言語に近い柔軟なパターンを取り入れつつ、静的型付けによる安全性も兼ね備えています。また、軽量スレ