C言語の「定数へのポインタ」とは?意味・宣言方法・動作をサンプルコードで解説
定数へのポインタとは何か
C言語における「定数へのポインタ(pointer to constant)」とは、ポインタが指し示す先の値を読み取り専用にするための宣言方法です。この場合、ポインタ変数そのものに別のアドレスを代入することはできますが、ポインタを通して指し示す先の値を書き換えることはできません。
宣言の基本構文は以下のとおりです。
Data_Type const* Pointer_Name;
たとえば、次のように記述します。
int const *p; // 定数整数へのポインタ
例1:const を付けた場合(値の変更はエラーになる)
以下は、定数へのポインタの動作を確認するC言語プログラムです。
#include<stdio.h>
int main(void){
int var1 = 100;
// 定数整数へのポインタ
const int* ptr = &var1;
// 指し示す先の値を変更しようとする
*ptr = 10;
printf("%d\n", *ptr);
return 0;
}
実行結果:
エラー:読み取り専用の値を変更しようとしています
このように、const が付いたポインタ経由で値を代入しようとすると、コンパイル時にエラーとなります。これは「*ptr が指す先は読み取り専用である」という制約があるためです。
例2:const を外した場合(値の変更が可能)
次に、const を外した通常のポインタで同じ処理を行った場合を見てみましょう。
#include<stdio.h>
int main(void){
int var1 = 100;
// const を外した通常のポインタ
int* ptr = &var1;
// 指し示す先の値を変更する
*ptr = 10;
printf("%d\n", *ptr);
return 0;
}
実行結果:
10
const がない場合は制約がないため、ポインタ経由でも自由に値を書き換えられます。出力結果からも、var1 の値が 10 に更新されたことが分かります。
補足:「定数へのポインタ」と「ポインタ定数」の違い
混同しやすい概念として「ポインタ定数(constant pointer)」があります。両者の違いは以下のとおりです。
- 定数へのポインタ:
const int *p… 値の変更は不可、指すアドレスの変更は可 - ポインタ定数:
int *const p… 指すアドレスの変更は不可、値の変更は可 - 両方を固定:
const int *const p… 値もアドレスも変更不可
用途に応じて適切な形を選ぶことで、意図しないデータの書き換えを防ぎ、より安全で信頼性の高いコードを書くことができます。
-
ネットワークのインターフェースとサービスとは?基本概念と種類をわかりやすく解説
ネットワークサービスとは 一般的にネットワークサービスとは、アプリケーション層以上で動作し、コンピュータネットワーク上で利用されるアプリケーションのことを指します。 ネットワークサービスは、データの保存(ストレージ)、操作(処理)、提示(プレゼンテーション)、通信といった機能を提供します。実装方式としては、クライアント・サーバ型アーキテクチャ、またはピアツーピア(P2P)型アーキテクチャが採用されます。 サービスインターフェースとは サービスインターフェースは、SOA(Service-Oriented Architecture:サービス指向アーキテクチャ)を実現するための仕組みです。これによ
-
C言語における静的メモリ割り当てとは?仕組みとサンプルコードで徹底解説
C言語でプログラムが使用するメモリは、大きく分けて「静的メモリ割り当て」と「動的メモリ割り当て」の2つの方法で確保されます。 静的メモリ割り当て(Static Memory Allocation)とは 静的メモリ割り当てとは、変数のサイズがプログラムの実行前に決定され、固定サイズの領域として割り当てられる方式です。一度確保されたメモリは、明示的に解放することはできません。プログラム内で宣言された変数に対して、あらかじめメモリが割り当てられます。 静的メモリ割り当ての主な特徴 アドレス演算子「&」を使って変数のアドレスを取得し、ポインタに代入することができます。 メモリはコンパイル時