[C 言語] 基本ポインター、超詳細、コード例を含む

リンクの説明を追加


序文

こんにちは、この記事の著者は、これまでに学んだポインターの基礎知識を超詳しくまとめています。ポインタは C 言語を学習する上で非常に重要な知識であり、C 言語の本質でもありますので、一緒にポインタについて学びましょう。


1. ポインターとは正確には何ですか?

  1. ポインタはメモリ内の最小単位の番号、つまりアドレスです。

  2. 話し言葉におけるポインタは通常、メモリアドレスを格納するために使用される変数であるポインタ変数を指します。

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

  4. 32 ビット マシンでは、アドレスは 32 個の 0 または 1 で構成されるバイナリ シーケンスであり、アドレスは 4 バイトに格納する必要があるため、ポインター変数のサイズは 4 バイトにする必要があります。
    64 ビット マシンでアドレス行が 64 行ある場合、アドレスを格納するためのポインター変数のサイズは 8 バイトになります。

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

2. 各種ポインタ情報

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

変数には整数、浮動小数点などのさまざまな型があることは誰もが知っています。ポインタには型がありますか?
正確に言うと、はい。
以下のコードを参照してください。

int num = 10;
p = #

&num (num のアドレス) を p に保存するには、p がポインター変数であることがわかりますが、その型は何でしょうか?
ここで、ポインタ変数に対応する型を与える必要があります。

char  *pc = NULL;
int   *pi = NULL;
short *ps = NULL;
long  *pl = NULL;
float *pf = NULL;
double *pd = NULL;

ここで次のことがわかります。
char* 型のポインタは、char 型変数のアドレスを格納することです。
short* 型ポインタは、short 型変数のアドレスを格納するために使用されます。
int* 型のポインタは、int 型の変数のアドレスを格納するために使用されます。
等々!


2. ポインタ±整数

ポインターはさまざまな操作も実行できます。以下を参照してください。

#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;
}

概要: ポインターのタイプによって、ポインターが 1 歩前進または後退する量 (距離) が決まります。

3. ポインタの逆参照

ポインターを使用して変数のアドレスを保存した後、逆参照 '*' 演算子を使用して、保存されたアドレスに対応する変数を操作する必要があります。次のコードを参照してください

#include <stdio.h>
int main()
{
    
    
 int n = 0x11223344;
 char *pc = (char *)&n;
 int *pi = &n;
 *pc = 0;   //Pi是char*类型的指针变量,所以它可以操作1个字节的内存空间
 *pi = 0;   //Pi是int*类型的指针变量,所以它可以操作4个字节的内存空间
 return 0;
}

概要:
ポインターのタイプによって、ポインターを逆参照する際の権限 (操作できるバイト数) が決まります。
たとえば、char* ポインターの逆参照では 1 バイトしかアクセスできませんが、int* ポインターの逆参照では 4 バイトにアクセスできます。

4. ワイルドポインター

ワイルド ポインタとは、ポインタが指す場所が不明であることを意味します (ランダム、不正確、明確な制限がない)。
ワイルド ポインタが指す空間を使用する権利は私たちの手にはないため、ワイルド ポインタを操作することはできません。強制的な操作はエラーを報告するか、コンピュータに有害です。

ワイルド ポインターの原因:

  1. ポインタは初期化されておらず、ローカル ポインタ変数はランダムな値になるように初期化されていません
  2. ポインタの範囲外アクセス。この状況は主に配列で発生します (ポインタが指す範囲が配列 arr の範囲を超える場合、p はワイルド ポインタです)。
  3. ポインタが指した空間は解放され、指した空間は解放されたのですが、アドレスを無理に操作するとワイルドポインタ例外が発生します

ワイルド ポインタを回避する方法:
4. ポインタの初期化
5. 範囲外のポインタに注意する
6. NULL の場合でもポインタ ポインタ領域を解放する
7. ローカル変数のアドレスを返さないようにする
8. 使用前にポインタの有効性を確認する

5. ポインタ操作 ポインタ-ポインタ

明確にする必要があります。ポインターからポインターを減算した結果は、これら 2 つのポインターが指すスペース間で異なる要素 (スペース) の数です (減算が負の場合は絶対値を取得します)。これについては明確にする必要があります。たとえば、
次のコードを参照してください。

int main()
{
    
    
	int arr[10] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	int len = &arr[9] - &arr[0];
	printf("%d\n", len);
	return 0;
}

演算の結果は次のようになります。10
ここに画像の説明を挿入
番目の要素のアドレスから最初の要素のアドレスを引いたものが、要素間で異なる要素の数、つまり 9 になります。

6. ポインタとポインタの比較関係

この標準では、
配列要素へのポインタは、配列の最後の要素の後のメモリ位置へのポインタと比較できるが、最初の要素より前のメモリ位置へのポインタと比較することはできないと規定されています。

7. セカンダリポインタ

ポインタ変数も変数であり、変数にはアドレスがありますが、ポインタ変数のアドレスはどこに格納されているのでしょうか?
これは 2 番目のポインターの
例です。

int main()
{
    
    
	int a=10;//普通整型变量
	int* p = &a;//一级整型指针
	int** pp = &p;//二级整型指针
	printf("%d\n", *(*pp));//10
	return 0;

}

同様に、3 レベル、4 レベルのポインタなどもあります。

要約する

これらは、今日共有および要約された基本的なポインタです。ブロガーは後ほど高度なポインタに関する詳細な記事を更新し、ポインタのより詳細な分析と理解を実施します。気に入ったら、フォローアップに注目してください。 。 ご清覧ありがとうございました!

おすすめ

転載: blog.csdn.net/m0_71214261/article/details/132164962