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

【C言語入門】ポインタの概念を理解するためのサンプルプログラムを解説

ポインタ(pointer)とは、他の変数のアドレス(メモリ上の場所)を格納するための特殊な変数です。C言語を学ぶ上で最も重要かつつまずきやすい概念のひとつですが、仕組みを正しく理解すれば、より効率的で柔軟なプログラムを書けるようになります。

ポインタの主な特徴

ポインタには以下のような特徴があります。

  • メモリ領域を節約できる

  • メモリ上の位置に直接アクセスできるため、実行速度が速い

  • 動的にメモリを確保・解放できるなど、メモリを効率的に扱える

  • リンクリストやツリーなどのデータ構造と組み合わせて利用される

ここからは、ポインタを使って文字列の中の特定の文字にアクセスし、表示するデモンストレーションを行います。ポインタ演算を利用すると、配列の任意の要素を読み取るだけでなく、値を書き換えることも可能です。

サンプルコード1

次の例では、ポインタを使って配列内の要素に順番にアクセスしています。

#include<stdio.h>
int main(){
    char array[9] = "Tutorial", *ptr, i, *ptr1;
    ptr = &array[1];
    ptr1 = ptr + 3;
    *ptr1 = 101;
    for(i = 0; i < 4; i++)
        printf("%c", *ptr++);
    return 0;
}

実行結果

このプログラムでは、まずポインタ変数 ptr に、配列の2番目の要素('u')のアドレスを代入しています。続いて ptr + 3 のアドレス(4番目の要素)に対して、ASCIIコード 101、つまり文字 'e' を書き込んでいます。

その後、*ptr++ を使って先頭の 'u' から4文字分を出力するため、結果は以下のようになります。

utoe

このように、ポインタの加算によって「指し示す位置」を移動させ、間接参照(*)によってその場所の値を読み書きできることが確認できます。

サンプルコード2

もうひとつ、別の例を見てみましょう。

#include<stdio.h>
int main(){
    char string[13] = "CprogRamming", *p, i, *p1;
    p = &string[5];
    p1 = p + 3;
    *p1 = 101;
    for(i = 0; i < 4; i++)
        printf("%c", *p++);
    return 0;
}

実行結果

この例でも同様に、p は6番目の要素 'R' を指し、そこから3つ先の 'm''e'(ASCIIコード101)に書き換えています。ループで4文字出力するため、実行結果は次の通りです。

Rame

これらの例からわかるように、ポインタを使えばメモリアドレスを直接操作することで、配列や文字列の任意の位置に柔軟にアクセスできます。ポインタ演算と間接参照の関係を掴むことは、C言語でのメモリ操作を理解する第一歩となるでしょう。

  1. 【初心者向け】C言語で二次方程式の根(解)を求めるプログラムの作り方

    問題ソフトウェア開発の手法をC言語に適用し、二次方程式の根(解)を求めるプログラムを作成します。解決策二次方程式 ax2 + bx + c = 0 の根を求めます。二次方程式には必ず2つの根が存在します。分析入力:係数 a、b、c の値出力:根 r1、r2 の値手順(解の公式)二次方程式の根は、以下の「解の公式」によって求めることができます。$r_{1}=\frac{-b+\sqrt{b^2-4ac}}{2a}$$r_{2}=\frac{-b-\sqrt{b^2-4ac}}{2a}$ここで、b2 − 4ac を判別式と呼びます。判別式の値によって、根の性質が次のように変わります。判別式 >

  2. C言語のポインタ入門!宣言・初期化から配列アクセスの実例まで徹底解説

    ポインタ(pointer)とは、他の変数のメモリアドレスを格納するための変数です。C言語においてポインタは、メモリを直接操作したり、関数間でデータを効率的にやり取りしたりするために欠かせない重要な概念です。 ポインタの宣言・初期化とアクセス まず、次のような通常の整数変数の宣言を見てみましょう。 int qty = 179; 変数qtyには値「179」が格納されると同時に、メモリ上のどこかにその格納場所(アドレス)が割り当てられます。 ポインタの宣言 int *p; 「p」はポインタ変数であり、別の整数型(int)変数のアドレスを保持します。変数名の前にアスタリスク(*)を付けることで、「こ