c / c ++インタビューで範囲外のポインター配列について話す-ワイルドポインターnullポインター-ポインター配列ポインターの問題

ポインタの定義

  ポインタはプログラミング言語のオブジェクトであり、アドレスを使用して、その値はコンピュータメモリの別の場所に格納されている値を直接指します。簡単に言えば、コンピュータメモリのすべてのバイトには番号があり、ポインタにはこの番号が格納されており、一意のメモリユニットを見つけることができます。通常、コードで定義された* pを記述します。これは、実際の意味でのポインターではなく、ポインター変数です。

紛らわしい問題

  1. ポインタがポインタから減算され、結果はバイトの差ではなく、同じタイプの数の差、つまりバイトの差がポインタのタイプで除算されます。
  2. ポインタのサイズとポインタにiを加えたものがわかります。ポインタは32ビットコンピュータでは4バイト、64ビットコンピュータでは4バイトまたは8バイトになります。状況によって異なります。ポインタは格納されます。アドレス、1ワード省エネ表現の最大範囲は0〜255で、コンピュータには十分とは言えません。したがって、4バイトが必要、1バイトは2 ^ 8、4バイトは2 ^ 32、ポインタプラスの場合iの場合、ポインタはこのデータグループの最初の要素の最初のアドレスを表します。iが1の場合、データと対応するタイプのアドレスが加算されます。

インスタンス

ここに画像の説明を挿入
コード

#include <stdio.h>
int main()
{
	int i = 0;
	int arr[10] = { 0 };
	int* a = arr;
	for (i = 0; i <= 12; i++)
	{
		*(a+i) = 0;
		printf("sb %d", i);
	}

	return 0;
}

  コードを分析し、int型の配列を作成するだけで、配列は10個のデータを格納でき、バイトサイズは40です。最初の要素は0に初期化され、後者は初期化されないため、次の要素はデフォルトで0になります。作成されたint型ポインタ。配列arrの下の最初の要素のアドレスを格納します。forループは13回ループします。明らかにこれは配列の範囲を超えており、配列内の要素は0に再割り当てされます。ループし、sbとiの値を出力します。注意深い人は、関数が明らかに12回ループしていることに気付くでしょうが、印刷プロセス中に12は出力されていません。その後、実行後、このコードは最初にエラーを報告せず、無限ループであることがわかります。これは、システムが配列の範囲外でランダムチェックを実行するためです。すべてが範囲外であるとは限りません。 -boundsコンパイラは見つけることができます。無限ループの問題については、デバッグを通じてarrの最初の要素のアドレスを確認します。
ここに画像の説明を挿入
  アドレス0x00D5FC68はarrの最初の要素のアドレスであり、アドレス0x00D5FC98はiのアドレスです。配列が範囲外であるため、12番目のループでiの値が0に再割り当てされ、ループが再開されます。最初に、これを無限ループから繰り返します。

ワイルドポインター

  公式には、初期化されていないポインタと配列の範囲外のポインタです。素人の用語では、ポインタがどこを指しているのかはわかりません。コンパイラは、使用時に値を内部で取得できることがよくありますが、リソースのこの部分は元々リソースに属していないため、プログラムがリソースの解放を終了すると、プログラムで問題が発生します。

ヌルポインタ

  オブジェクトまたは関数を指さないポインター。初期化、割り当て、または比較中に、一方がポインター型の値または式である場合、コンパイラーは、もう一方の定数0がnullポインターであると判断し、正しいnullポインタ値。

char *p = 0;
if (p != 0)

ワイルドポインターとヌルポインターの分析

  ワイルドポインタは任意の場所へのポインタであり、ヌルポインタはオブジェクトや関数を指さないことを保証します。2つの宣言方法とソースも異なり、nullポインターを適切に使用すると、メモリリークを回避できます。

ポインタ配列と配列ポインタの分析

  ポインタ配列と配列ポインタは完全に異なります。ポインタ配列は本質的には配列ですが、配列に格納されるデータはポインタ型であり、配列ポインタは基本的にポインタであり、配列へのポインタです。2つの定義方法も異なります。

//指针数组
int* arr1[10];
//数组指针
int  arr2[10];
int (*p2)[10] = &arr2;

  これら2つの方法で定義された初期値は同じですが、両方に同時に1を追加すると、ポインター配列は1バイト変化しますが、配列ポインターは4バイト変化する必要があります。

おすすめ

転載: blog.csdn.net/weixin_43580319/article/details/111196008