C言語のポインタで、深さの理解

1、メモリアドレス

ポインタはメモリアドレスを理解するために必要なものを理解するために。メモリアドレスは、コンピュータのメモリにアクセスするために使用されます。コンピュータ・メモリは、典型的には多くの小さなメモリユニットから構成されているので、メモリアドレスは、これらの小さなメモリセルを識別するために使用されます。メモリ・アクセス・メモリ・アドレスは、友人の家の住所が同じである知っている友人の家のニーズに行くような、知っておく必要があります。メモリセルの右側に、以下に示すように、左側は各メモリセルのアドレスを示します。図は、各セルは、バイトの内容を記憶してもよいです。
図1

2、変数のメモリアドレスを取得

それでは、どのようにそれの変数のメモリアドレスを得るのですか?C言語は、変数のメモリアドレスを取得する変数変数の前に取得することができ、アンパサンド(&)のメモリアドレスを増加させる方法を提供します。以下の変数は、プログラム・メモリ・アドレスをプリントアウトすることができます。
10 = INT;
のprintf( "A IS Dのアドレスの%"、&A)。

図3に示すように、ポインタ変数

変数は、コンテンツメモリアドレスに記憶されている場合、この変数は、ポインタ変数と呼ばれています。変数は、ポインタ変数で識別するために、この変数の定義は、通常*プラス変数の前に符号、定義は、ポインタ変数の下に与えられている:
INT = A. 8;
チャーC =「S」;
INT * P; / / Pは、P *の数値のためのフロント、ポインタ変数であり、pは、メモリアドレス、メモリに保存される
データの型intを格納するアドレス。
P =&; //メモリアドレスへのポインタ変数pに

CHAR * Q、Q *のフロント数があるので// Qはポインタ変数は、であり; qは、内のメモリアドレスに保存された
CHARデータ型に格納されたメモリアドレス。
Q =&C;ポインタメモリアドレスへの// C変数q
図2
彼ら自身がメモリを取るように、変数Q及びQ自体、上記のように。格納されたメモリアドレスpは0x0000000c(可変メモリアドレス)、メモリアドレスが格納されているint型のデータ8で、格納されたメモリアドレスqが0x00000004(変数cのメモリアドレス)、文字を格納するメモリアドレスのあります」。
注:int型は、典型的には、4つのバイトを占有し、ポインタ変数はまた、典型的には4つのバイトを占有され、char型は、通常、1つのバイトを占めます。

図4に示すように、アクセス・コンテンツへのポインタ

アスタリスクが先行ポインタでは、ポインタポイントの内容にアクセスすることができます

printf( "%のC"、* Q); // Q印刷内容が指摘外、それは文字がS出力
のprintf( "%のD"、* P); // P点は、デジタル出力の内容を印刷8

下に示すように、上記メモリマップの実行前にブロック。
図3

図5に示すように、コンテンツポインタ

*ポインタが前の数字は、コンテンツポインタの点を変更してもよいです

次の2つのステートメントは、コンテンツポインタを変更
* P = 10; // 10におけるPの含有量
* Q =「D」;コンテンツ「D」を変更する// Qポイント
図4

図6に示すように、ポインタ変数の初期化と割り当て

そうでない場合は、ポインタ変数を使用する前(点に特定のメモリアドレスに)割り当てられている必要があり、割り当てアクセスは、例外を引き起こします。次のプログラムセグメントには問題があります。

int型* P;

* P = 10; //ポインタPが割り当てられていない、それは誤りであろう

次のブロックが正しい
= INT 8;
int型* P;
P =&; P点まで// p個の割り当て変数Aへ
* P = 10; //変数aが10で変更、その後、あなたは間違いなくできます図10は、変更され

要改变p指向的内容,可以重新对p进行赋值,如下程序段先让p指向a再让p指向b
int a=8;
int b=9;
int *p;
p = &a; //p指向a
*p = 10;//修改a的值为10
P = &b;//p指向b
*p = 11;//修改b的值为11

7、 指向指针的指针

int **p;
前文出现过,int p, 比较容易理解,就是定义一个指向int类型的指针。那么这里的int **p是什么呢?
对于这种特殊形式,首先可以确定的是p是一个指针,因为p前面不但有
号而且还有两个号,所以肯定是指针。
那么两个
号又是什么意思呢?
把int **p分解为以下形式,和int *p比较,就会看的比较清楚
int * p; //指针p指向 int类型
int p;//指针p指向int类型
其实上面的两种形式区别就在于:指针指向的内容的类型不同,一个指向int
类型一个指向int类型

int a = 10;
int *q;
int **p;

q = &a;//q 指向 a
p =&q; //p 指向q, q是一个int类型指针
该程序段执行完毕后内存映像如下:

図5

リリース元の2件の記事 ウォンの賞賛0 ビュー66

おすすめ

転載: blog.csdn.net/hw2169/article/details/103792090