【C言語初級】ポインタの基礎をやさしくマスター(1) ~ポインタの定義・型・サイズ~

ここに画像の説明を挿入

Junxi_ の個人ホームページ

勤勉であり、誰も待たないように何年も費やすことを奨励してください

C/C++ ゲーム開発


こんにちは、Junxi_ です。今は少し怠けています。今日から更新を再開し、新シリーズの歯磨き問題を更新していきます。引き続き、C 言語入門 0 基礎の内容を更新していきましょう。今日はポイントをお届けします。ただし、初級レベルなので、応用編では応用的な使い方についてお話します。今日は基礎のみについて話します。

1. ポインタとは何ですか?

  • 初心者にとって最も混乱するのはポインターの意味であり、間違った適用につながるため、今日はポインターとは何かについて説明します。

ポインタを理解するための 2 つの重要なポイント:
1. ポインタはメモリ内の最小単位、つまりアドレスの番号です。
2. 話し言葉で通常指すポインタは、メモリ アドレスを格納するために使用される変数であるポインタ変数を指します。

  • 概要: ポインタはアドレスであり、話し言葉でのポインタは通常、ポインタ変数を指します。

メモリ変数とポインタ変数

  • メモリー
    ここに画像の説明を挿入
  • ポインタ変数

& (アドレス演算子) を使用して変数のメモリ開始アドレスを取り出し、そのアドレスを変数 (ポインタ変数) に格納できます。

#include <stdio.h>
int main()
{
    
    
    int a = 10;//在内存中开辟一块空间
    int* p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
    //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量中,p就是一个之指针变量。
    return 0;
}
  • 要約:
  • ポインタ変数は、アドレスを格納するために使用される変数です。(ポインタに格納された値はアドレスとして扱われます)。
  • ここでの質問は次のとおりです。
  • 小型ユニットとはどのくらいの大きさですか? (1バイト)
  • そして、どのように対処すればよいのでしょうか?
  • 慎重な計算と比較検討の結果、対応するアドレスにバイトを割り当てることがより適切であることがわかりました。
  • 32 ビット マシンの場合、32 のアドレス ラインがあると仮定し、各アドレス ラインがアドレス指定 (1 または 0) 中にハイ レベル (高電圧) とロー レベル (低電圧) を生成すると仮定すると、32 のアドレス ラインによって生成されるアドレスは次のようになります

    ここに画像の説明を挿入
  • 64位机器同理,有64位地址线,这里仅以32位机器为例。
  • 二进制,由于有32根地址线,所以一共有2的32次方个字节的空间,也就产生了这么多的编号。
    ここに画像の説明を挿入
  • わかっています (2^32Byte = 2^32/1024KB =2^32/1024/1024MB = 2^32/1024/1024/1024GB = 4GB)
  • この時点で、4GB のスペースに対処できます。
  • ここで私たちは次のように理解します。
  • 32 ビット マシンでは、アドレスは 32 個の 0 または 1 で構成されるバイナリ シーケンスであり、アドレスは 4 バイトに格納する必要があるため、ポインター変数のサイズは 4 バイトにする必要があります。
  • 64 ビット マシン上で 64 のアドレス行がある場合、アドレスを格納するためのポインター変数のサイズは 8 バイトになります。

概要:
ポインタ変数はアドレスを格納するために使用され、アドレスはメモリ ユニットを一意に識別します。
ポインタのサイズは、32 ビット プラットフォームでは 4 バイト、64 ビット プラットフォームでは 8 バイトです。


2. ポインタとポインタの型

  • 変数と同様に、ポインタにもさまざまな型があります。
int *p;     //定义一个指针变量P,指向整形变量 
char *p;		// 定义一个指针变量p,指向字符型变量 
float * p; 		// 定义一个指针变量p,指向单精度浮点型变量 
double *p1, *p2;		//定义两个指针变量p1和p2,指向双精度实型变量 
  • 这里可以看到,指针的定义方式是: type + * 。(type指类型名)

ポインタ ± 整数

  • コードを見てみましょう:
#include <stdio.h>
//演示实例
int main()
{
    
    
    int n = 10;
    char* pc = (char*)&n;
    int* pi = &n;
    printf("%p\n", &n);
    printf("%p\n", pc);
    printf("%p\n", pc + 1);
    printf("%p\n", pi);
    printf("%p\n", pi + 1);
    return 0;
}

ここに画像の説明を挿入

  • ここでの %p はアドレスを出力することを意味します。
  • 1. 印刷結果から、&n と pc のアドレスが同じ、つまり両方とも同じ場所を指していることがわかります。(ここでは、n が int 型なので、使用する前に char 型にキャストする必要があります)
  • 2. 2 と 3 から、ポインタに 1 を追加することはアドレスに 1 を追加すること、つまりアドレスが次のビットを指すことがわかります。
    - 3. 3、4、5 から、異なるタイプのポインタ + 1 のアドレスが異なり、これはポインタ変数のタイプに関連していることがわかります。
  • 概要: ポインターのタイプによって、ポインターが 1 歩前進または後退する距離 (距離) が決まります。
  • ただし、ここでは、同じオペレーティング システムではポインタ変数のサイズが同じであることを知っておく必要があります。

ポインタ変数のサイズ

  • 上でポインタがメモリに格納される方法と格納領域のサイズについて説明しましたが、領域が多ければ当然、アドレスの数、つまりポインタの数も多くなります。
  • コードでテストします。
#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
    
    
  printf("%d\n", sizeof(char *));
  printf("%d\n", sizeof(short *));
  printf("%d\n", sizeof(int *));
  printf("%d\n", sizeof(double *));
  return 0;
}

ここに画像の説明を挿入

  • 私のコンピュータは 64 ビット プラットフォームなので、ポインタのサイズは 8 バイトです

概要:
32 ビット プラットフォームのアドレスは 32 ビット (つまり 4 バイト)
64 ビット プラットフォームのアドレスは 64 ビット (つまり 8 バイト)

ポインタの逆参照

#include <stdio.h>
int main()
{
    
    
    int n = 0x11223344;
    
    int* pi = &n;
    *pi = 0;
   char* pc = (char*)&n;
   *pc = 0;
    return 0;
}

ここに画像の説明を挿入

  • 上記は、pi の値を 0 に変更した場合のメモリ内の pi の保存です。
    ここに画像の説明を挿入
  • 4バイトに格納されているデータは全て0に変更されます。
    ここに画像の説明を挿入
  • 上記はメモリ上のpcのアドレスですが、アドレスのデータも0にすると1バイトのアドレスだけが変化することがわかります。
  • 要約:
  • ポインターの型によって、ポインターを逆参照する際の権限 (操作できるバイト数) が決まります。
  • たとえば、char * のポインタの逆参照は 1 バイトのみにアクセスでき、int * のポインタの逆参照は 4 バイトにアクセスできます。

要約する

  • 今日の内容はひとまずここまでです 今日はポインタの定義、型、サイズ、各型の違いについてお話します 残りは何回かに分けて説明していきます

  • 質問がございましたら、コメント欄またはプライベート メッセージでお問い合わせください。また次回お会いしましょう。

新しいブロガーを作成するのは簡単ではありません。記事の内容が役立つと思われる場合は、離れる前にこの新しいブロガーをクリックするとよいでしょう。皆様の応援が更新の励みになります!

**(Ke Li はブロガーを 3 回連続でサポートするようお願いしています!!! 以下のコメントをクリックして「いいね」を押し、Ke Li を支援するために集めてください)**

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/syf666250/article/details/131497865