学習ノート---初識ポインタ


変数と変数ポインタ:
変数:
変数を定義すると、システムは対応するメモリ領域を与えます.変数のデータ型は、変数によって得られるメモリのサイズに影響します.
次のようになります.
int型変数のバイト数は4であるため、int型変数を定義する場合.システムはランダムに4つの連続したメモリユニットをこの変数の記憶空間として取得する.
たとえば
int i =100;
float f=2.3;
 char c='k'; 

メモリには、このようにしてこれらの変数にスペースを割り当てることができます.
これらのメモリユニットには番号があります.これらの番号は彼らの「アドレス」です.
例:
変数cが表すメモリセルのアドレスは0 x 20 fe 10である
変数iが表すメモリセルのアドレスは、0 x 20 fe 18~0 x 20 fe 1 Bである.
このとき、iに格納されたデータは、図のように4つのメモリセルに同時に格納される.
ポインタ変数:
ポインタ変数を定義すると、システムは対応するメモリ空間(32ビットシステムの4バイト)を付与し、ポインタ変数はメモリアドレスを格納するための変数とみなすことができる.
ポインタ変数の定義方法は次のとおりです.
[データ型]*[ポインタ変数名];
注意:ポインタ変数に値を割り当てると、p=&aなどの決定された値を割り当てることができます.p=nullなどの空の値を割り当てることもできます.
注2:Nullに値を付けるのとしないのとでは、どのような違いがありますか?値を割り当てない場合のpのデフォルト値は乱数であり、呼び出されるとランダムなものが呼び出され、プログラムが使用する権利のあるリソース以外のものが呼び出される可能性があります.間違いを報告します.Nullに値を割り当てると、nullはバイナリに特定の量があるため、pには特定の値があります.
注3:ポインタの値がNullの場合、ポインタを空のポインタと呼びます.ポインタに値が割り当てられていない場合、ポインタを野ポインタと呼びます
注意4:32ビットプラットフォームでは、各ポインタ変数にデフォルトで4バイトのメモリセルが割り当てられ、変数のアドレスを格納します(このサイズは「アドレス空間」で決定されます).
ポインタ変数に値を割り当てるには、次の手順に従います.
[ポインタ変数名]=&[変数名];
変数に格納されているのはデータです.ポインタ変数に格納されるのは、データを格納する変数の「アドレス」です.
たとえば、以前に定義した変数iがInt型である場合、iアドレスを格納するポインタ変数を定義するプロセスは、次のとおりです.
int *p;
p=&i;

注1:(&この記号は「アドレスを取る」演算子と呼ばれ、変数のアドレスを取得するために使用されます)
このとき,pに格納されているのがiのアドレスである.
注2:int型変数iを定義し、iは、例えば、0 x 20 fe 18~0 x 20 fe 1 Bのメモリセルを占有するが、iのアドレスは0 x 20 fe 18のみ(最初のメモリセルのアドレス)で表される.p=&iを実行する.その後、pに格納されるのは0 x 20 fe 18である.
タブー1:初期化されていないポインタ変数に値を割り当てます.次のようになります.
#include <stdio.h>
#include <stdlib.h>
/*
                  
*/
int main()
{
    int a=10,b=100;
    int *p1,*p2;//                   
    *p1=10;// p1               
    *p2=100;
    printf("%d %d
",a,b); printf("%d %d
",*p1,*p2); return 0; }

上のポインタ変数の注2を参照すると、このコードは使用が許可されていないメモリを呼び出しているため、プログラムがエラーを報告します.
タブー2:ポインタ変数に特定の値を割り当てます(ポインタ変数に整数で値を割り当てることはできません).次のようになります.
#include <stdio.h>
#include <stdlib.h>
/*
                  。
*/
int main()
{
    int a=10,b=100;
    int *p1,*p2;
    p1=0x100000;//  p1         
    p2=0x100004;
    printf("%d %d
",a,b); printf("%d %d
",*p1,*p2); return 0; }

上記のポインタ変数の注2を参照すると、このコードはポインタ変数を特定のメモリ空間に指向させようとしますが、これは許可されません.
このメモリ領域は他のプログラムやシステムによって呼び出されている可能性があるため、私たちのプログラムは必ずしもメモリを呼び出す権利がありません.だから間違ったことを報告します
(このプログラムの2つのポインタも「野ポインタ」となります).
添付:変数値のアクセス方法:
直接アクセス:
例えばprintf("%d",i);
間接アクセス:
例えば:int*p;p=&i;printf("%d",*p);
注意:*この記号は「ポインタ」演算子(または間接アクセス演算子)と呼ばれ、ポインタが指すアドレスの値を取得できます.pにはiのアドレスが格納されているので、*pは*&iに等価でiに格納された値を取得することができる.