データ構造を学習する前に習得する必要があるCの知識の要約(ポインター1)

序文:

データ構造の本は多くの人にとって学ぶのが非常に困難であり、データ構造は学習するために多くのCの知識を必要とするため、データ構造は本当に難しいので、ポインタと構造はCで説明されているデータ構造内にありますの役割はかけがえのないものです。これらのことを理解していない場合、疑似コードでいっぱいのデータ構造の本を進めるのはほとんど難しいので、データ構造を学ぶ前に習得する必要がある知識の一部を要約します。

ポインタ

ポインタ:必要な変数ユニットはアドレスを通じて見つけることができます。アドレスは変数ユニットを指していると言えます。アドレスを視覚的にポインタと呼びます。(変数のアドレスは、変数の
ポインタと呼ばれます1.ポインタ変数
別の変数のアドレスを格納するための専用の変数(つまり、ポインタ)がある場合、それはポインタ変数と呼ばれます。
例:

int a = 19;
int* point_1;
point_1 = &a;
printf("%d,%d,%d,%d\n", a, &a,point_1,*point_1);

ここに画像の説明を挿入
この単純なプログラムでは、これらの4つの変数の結果、a = point_1、&a = point_1を見つけることができます。これは、変数aのアドレスがポインター変数point_1に割り当てられているためです。そのため、ポインター変数が%dの形式で出力されると、の値は実際には変数aのアドレスです。point_1がポイントされている場合、それは point_1です。ポインター変数はaのアドレスであるため、* point_1の値は実際にはaで表される値です。簡単に理解すると、ここでポインター変数はアドレスであり、ポインターは値です。

それで、ポインタ変数がどの変数も指していない場合、その値はどのようになりますか?
プログラムを介して実行すると、機能しないことがわかり、プログラミングソフトウェアは変数が初期化されていないことを示すプロンプトを表示しますが、実際に変数を初期化しない場合、その値は不明でランダムです。

2.ポインター変数の
型名を定義する方法 + *
int * point_1などのポインター変数名
(型名はintではなくint *であることに注意してください。int *は整数変数へのポインターを意味し、intは整数を定義することを意味しますタイプ変数。これは同じではなく、point_1はポインタータイプ名であり、文字タイプなどの他のタイプでも同じです)
3.ポインターの初期化では、
最初にポインター変数を定義してから割り当てることができます。つまり、変数を指すと言いましたが、定義中に直接割り当てることもできます
:int * point_1 =&a;
または
int * point_1;
point_1 =&a;
ここでは、intおよび他の型を基本型と呼びます定義するときに忘れないでください。基本型が異なります。つまり、メモリで表されるバイト数が異なります。たとえば、整数データは4バイトで、文字型は1バイトです。ポインターを移動すると、基本型が整数の場合、(図に示すように)4バイトが一度に移動され、残りは同じです。

int a = 19;
int* point_1;
point_1 = &a;
point_1++;
printf("%d,%d\n",  &a,point_1);

ここに画像の説明を挿入

(* point_1 =&aと記述してはいけないことに注意してください。ここでは誤りです。タイプがすべて異なることがわかっているため、どのように割り当てることができますか?)
4.参照ポインター変数は
ポインター変数point_1用です、多くの形式で引用し
ます1.直接引用:
たとえば、pirntf( "%d"、point_1);
また、point_1 =&aなどの一部の割り当てで引用することもできます
2.間接引用
たとえば
、バンドを書き込む場合関数本体を持つ関数がある場合、ポインターは特定の変数を指します。パラメーターの場合、それが実際のパラメーターであるか仮パラメーターであるかに関係なく、渡されるものは基本的にポインター、つまり、ポインターが指す変数のアドレスです。これをアドレスと呼びます
。5。ポインタ配列
ポインタ変数は変数を指すことができるため、配列を指すこともできます。実際、配列内の各要素には対応するアドレスがあり、変数名で表されるアドレスは配列内にあるとも言えます最初の要素で表されるアドレスは、実際には配列のアドレスであり、ポインターとは配列を指します。つまり、ポインターは配列の最初の要素のアドレスを指します。

int a[4] = { 1,2,3,4 };
int* p;
p = &a[0];
printf("%d\n", *p);
p = a;
printf("%d\n", *p);

ここに画像の説明を挿入
注:p = a;の機能は、配列のすべての要素のすべてのアドレスをpに割り当てる代わりに、配列の最初の要素のアドレスをポインター変数Pに割り当てることです;
変数を定義するときにint *を直接書き込むこともできます。 p = a;
6.ポインタ要素を参照するときのポインタ演算
ポインタはアドレスであり、ポインタ
に対する演算は基本的にアドレスに対する演算です。たとえば、pがa [0]を指す場合、p + 1はa [1]を意味します(ここでは加算、減算、乗算、除算、自己加算、および自己減分はすべて適用可能です。2つのポインターが操作されるとき、それらが同時に同じ配列を指す場合にのみ意味があります)。
注:配列名はポインター定数であり、その値はプログラムの実行中に固定されるため、a ++は実現できません。
7.ポインタによる配列要素の参照
(1)添え字方式
(2)ポインタ方式
以下の2つの方法をプログラムで説明します。

	int *p,i,a[10];
p = a;
for (i = 0; i < 10; i++)
	scanf_s("%d", p++);

for (i = 0; i < 10; i++, p++)
		printf("%d", *p);
	printf("\n");
for (p=a,i = 0; i < 10; i++, p++)
		printf("%d", *p);
	printf("\n");
for (i = 0; i < 10; i++)
		printf("%d", a[i]);
	printf("\n");
for (p = a, p<(a+10); p++)
	printf("%d,", *p);  

ここに画像の説明を挿入
図からわかるように、出力の2行目は乱雑なものを出力しています。実際には、アドレスが10のアドレスを出力します。これは、pが自動インクリメントされるとき、アドレスの自動インクリメントなので、ループの後、pは実際にこれは配列の最後の要素であるため、Pの再ポイントが許可されていない場合、Pはインクリメントしており、配列の実効制限を超えているため、ポイントするアドレスを予測することはできません
。8。ポインター操作は、
主にここで説明する必要があります。 * p ++、*(p ++)、*(++ p)、++ * p、* ++ p、++(* p)いくつかの相違点と類似点があります。これらの結果を隠すためにコードを使用してみましょう。

	int *p,i,a[10];
p = a;
for (i = 0; i < 10; i++)
	scanf_s("%d", p++); for (p = a, i = 0; i < 10; i++)
	printf("%d,", *p);       			printf("\n");
	for (p = a, i = 0; i < 10; i++)
		printf("%d,", *p++);			printf("\n");
	for (p = a, i = 0; i < 10; i++)
		printf("%d,", *(p++));			printf("\n");
	for (p = a, i = 0; i < 10; i++)
		printf("%d,", *(++p));			printf("\n");
	for (p = a, i = 0; i <10; i++)
		printf("%d,", ++ * p);			printf("\n");
	for (p = a, i = 0; i < 10; i++)
		printf("%d,", *++p);			printf("\n");
	for (p = a, i = 0; i < 10; i++)
		printf("%d,", ++(*p));

ここに画像の説明を挿入
上記はほとんどポインタの操作が異なる結果ですが、それぞれの操作方法が原因を比較することで、読者が一目瞭然となるはずなので、ここでは説明しません。
ポインタについては、関数名としての配列名の知識は、データ構造において非常に重要です。これらの知識ポイントの構成は、次の記事で整理されます。遅すぎるので私は眠るので、理由を尋ねないでください。最後に、私の要約が正しいことを願っています。あなたは助けた。

おすすめ

転載: blog.csdn.net/weixin_47160672/article/details/108629971