【C言語】ポインタの詳しい解説(1)

ポインタは C 言語の重要な概念であり、C 言語の重要な機能です。ポインタを正しく柔軟に使用すると、プログラムを簡潔、コンパクト、効率的にすることができます。C 言語を学び使用する人は誰でも、ポインタを深く理解する必要があります。ポインタを学習してマスターする必要があります。 。

ポインタとは何ですか?

ポインタとは何ですか?

  1. ポインタはメモリ内の最小単位の番号、つまりアドレスです。
  2. 話し言葉におけるポインタは通常、メモリアドレスを格納するために使用される変数であるポインタ変数を指します。

概要:
ポインタはアドレスです。

ポインタ変数

& (アドレス演算子) を使用して、変数のメモリ開始アドレスを取得し、そのアドレスを変数に格納できます。この変数はポインタ変数です。

#include<stdio.h>
int main()
{
    
    
	//在内存中开辟一片空间
	int a = 10;
	//用p来接收a的地址
	int* p = &a;
	*p = 20;
	printf("%d", a);
	return 0;
}

画像.png
ポインター変数のサイズを計算します。

#include <stdio.h>

int main()
{
    
    
	int a = 10;
	int* p = &a;
	//计算指针的大小
	printf("%d", sizeof(p));
	return 0;
}

画像.png
要約:

  • 変数 a の値は、*p に新しい値を代入することで変更できます。
  • ポインタ変数は、メモリ ユニットを一意に識別するアドレスを格納するために使用されます。
  • ポインターのサイズは、32 ビット プラットフォームでは 4 バイト、64 ビット プラットフォームでは 8 バイトです。

ポインタとポインタの型

ポインタの定義方法

type +*
たとえば、int 型のポインタを定義します。
int * a;

ポインタの種類

私がリストしたポインタの種類は次のとおりです

int* p = NULL;
char* pa = NULL;
short* pb = NULL;
long* pc = NULL;
float* pd = NULL;
double* pe = NULL;

さまざまなタイプの変数のアドレスを格納するには、さまざまなタイプのポインタが使用されます。

ポインタ ± 整数

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

画像.png
pc+1 は 1 バイト後方に移動し、pi+1 は 4 バイト後方に移動していることがわかります。これらの後方歩行距離はすべてポインタの種類に関連しています
要約:
ポインタの種類によって、ポインタが 1 歩前進または後退する量 (距離) が決まります。

ワイルドポインター

ワイルド ポインターとは、ポインターが指す場所が認識できない (ランダム、不正確、明確な制約がない) ことです。

ワイルドポインタの原因

  1. ポインタが初期化されていません
  2. ポインタの範囲外アクセス
  3. ポインタが指すスペースが解放されます

ポインタが初期化されていません

コード:

#include<stdio.h>

int main()
{
    
    
	int* p;
	*p = 10;//指针没有初始化,导致程序出了问题
	return 0;
}

画像.png
ここでは、コンパイラがエラーの原因を直接報告しました。ローカル変数が初期化されていません。これはワイルド ポインタのケースの 1 つであり、初期化されたポインタはありません。

ポインタの範囲外アクセス

コードは以下のように表示されます:

#include<stdio.h>

int main()
{
    
    
	int arr[10] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;
	for (int  i = 0; i <= sz; i++)
	{
    
    
		printf("%d ", *(p + i));
	}
	return 0;
}

画像.png
i=sz の場合、arr 配列を超えてワイルド ポインターになり、出力される数値は制御できなくなります。

ポインタが指すスペースが解放されます

コードは以下のように表示されます:

int* t()
{
    
    
	int a = 10;
	return &a;
}
int main()
{
    
    
	int* p = t();
	*p = 20;
	return 0;
}

変数aのアドレスはt()関数内でのみ有効で、ポインタpにaのアドレスを渡すと、t関数が解放されるため、変数aの空間アドレスが解放され、pはaになります。ワイルドポインタ。

ワイルドポインタを回避する方法

  1. ポインタの初期化
  2. 境界外への注意深いポインタ
  3. ポインタは解放するスペースを指し、時間内に NULL を設定します
  4. ローカル変数のアドレスを返さないようにする
  5. ポインタを使用する前にその有効性を確認してください

ポインタ演算

ポインタ±整数演算

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

画像.png

ポインタ-ポインタ

コード:

#include<stdio.h>

int main()
{
    
    
	int arr[5] = {
    
     1,2,3,4,5 };
	printf("%d ", &arr[5] - &arr[0]);//得到的是中间的元素个数
	return 0;
}

画像.png

おすすめ

転載: blog.csdn.net/weixin_63284756/article/details/130737509