工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C 言語ポインタ完全ガイド: 型、使い方、ベストプラクティス

C 言語におけるポインタとは?

ポインタ は、別の変数のメモリアドレスを格納する変数です。アドレスを参照することで、ポインタは指し示すデータを間接的にアクセスまたは変更できます。この間接参照により、特に大きなデータ構造や動的メモリ割り当てを扱う際に、効率的なメモリ使用と高速な実行が可能になります。

C 言語でのポインタの使い方

整数変数 v を考えます:

int v = 0;
その値は 0 ですが、すべての変数には一意のアドレスがあります。アドレス演算子 (&) でこのアドレスを取得できます:
printf("Address of v: %p\n", (void*)&v);
表示されるアドレスはランダムな 16 進数のように見え、実行ごとに異なる場合があります。

以下は、ポインタがアドレスを格納する様子を示すシンプルなプログラムです:

#include <stdio.h>
int main() {
    int v = 0;
    int *y = &v; // y は v のアドレスを保持
    printf("Address stored in y: %p\n", (void*)y);
    printf("Value pointed to by y: %d\n", *y);
    return 0;
}

典型的な出力:

Address stored in y: 0x7ffeefbff5c8
Value pointed to by y: 0

ポインタの宣言

ポインタ宣言は以下のパターンに従います:

data_type *pointer_name;
ここで data_type はポインタが参照するデータの型です。有効な例:

int *ptr_int;      // int へのポインタ
double *ptr_double; // double へのポインタ
char *ptr_char;    // char へのポインタ

ポインタの初期化

宣言後、ポインタは有効なアドレスで初期化する必要があります。未初期化ポインタの使用は未定義動作を招きます。初期化構文:

pointer = &variable;
例:
#include <stdio.h>
int main() {
    int a = 10;
    int *p = &a;
    printf("Address in p: %p\n", (void*)p);
    printf("Value via p: %d\n", *p);
    return 0;
}

C 言語のポインタの種類

直接アクセス vs 間接アクセス

直接アクセスは変数名を直接使用。間接アクセスはポインタを使用。例:

#include <stdio.h>
int var = 1;
int *ptr = &var;
printf("Direct: %d\n", var);   // 1
printf("Indirect: %d\n", *ptr); // 1
*ptr = 48; // ポインタ経由で変更
printf("After change, indirect: %d\n", *ptr); // 48

ポインタ演算

ポインタが配列要素を指しているとき、整数を加算/減算すると、バイト数ではなく要素数分だけポインタが移動します。例:

int arr[5] = {1,2,3,4,5};
int *p = arr; // arr[0] を指す
for (int i = 0; i < 5; ++i) {
    printf("%d\n", *p);
    ++p; // 次の要素へ移動
}

重要なルール:

ポインタと配列

ポインタは配列要素の反復処理を簡潔に記述できます:

int a[5] = {1,2,3,4,5};
int *p = a; // &a[0] と同等
for (int i = 0; i < 5; ++i) {
    printf("%d\n", *p++); // 1 から 5 を出力
}

ポインタと文字列

文字列はヌル文字で終端される char 配列。ポインタ操作で文字列走査が容易になります:

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "Hello Guru99!";
    char *p = str;
    printf("First character: %c\n", *p);
    ++p;
    printf("Next character: %c\n", *p);
    // 文字列全体を出力
    for (int i = 0; i < strlen(str); ++i) {
        printf("%c\n", *p++);
    }
    return 0;
}

ポインタの利点

潜在的な落とし穴

重要なポイント

C言語

  1. 3Dプリンティング入門:原理、種類、主要応用を徹底解説
  2. 溶接完全ガイド:定義、種類、仕組み、用途、FAQ
  3. 鋳造とは:定義、製造プロセスの種類を徹底解説
  4. C# 変数とプリミティブデータ型:完全マスターガイド
  5. C言語ユーザー定義関数の4つの実証済みパターン
  6. C言語ポインタ完全マスター: 実践的エキスパートガイド
  7. C++ポインタをマスター:概念、例、実践的応用
  8. C言語ポインタ完全マスター:実践的ステップで上級プログラミングへ
  9. C++変数タイプ完全解説:メモリ、制限、操作
  10. Python 変数とデータ型:型の理解と活用
  11. Java変数の種類:ローカル、インスタンス、クラス変数を徹底解説