C 言語のポインタの使い方: 1. ポインタ変数のデフォルト値は通常の変数と同様に不定であり、通常は NULL に初期化されます; 2. ポインタ変数の使用方法は通常の変数とは異なり、一般に次のように区別されます。 p で終わる; 3. ポインタ ポインタ変数を介してメモリにアクセスするときに、変数の型によってアクセスされるバイト数が決まります。
C 言語ポインタの使用法:
1. ポインタ定義:
ポインタ変数の値の範囲は0~4Gのデータ型(メモリ番号を表す符号なし整数)です。変数の定義に使用できます(int、longと同様)。int、longとは異なり、メモリ番号を表す整数が格納され、この変数を通じて対応する番号のメモリにアクセスできます。
2. ポインタの役割
1. ヒープ メモリには名前を付けることができず (識別子を使用してヒープ メモリとの接続を確立することはできません)、ポインタを使用する必要があります。
2. 関数間のパラメータは値によって転送されます (メモリ コピー)。ポインタを使用すると、パラメータ転送の効率を最適化できます (変数は保護する必要があります)。 C言語では値の転送(メモリコピー)を行うため、変数のバイト数が増えると動作効率が低下し、転送される変数のアドレスは常に4バイトまたは8バイトしかコピーされません。
void func(const int* p);
ただし、ポインタ変数の値は変更される可能性があるため、const とともに使用できます。
3. 関数は互いに独立しています。共同作業には共有変数が必要になる場合があります (グローバル変数が多すぎると名前の競合が発生し、解放されずにメモリが無駄になります)。共有は、変数のアドレスを相互に渡すことによって実現できます。関数、変数の影響。
3. ポインタの使用法:
定義: Type* 変数名_p;
1. ポインタ変数とデフォルト通常の変数の値は不確実であり、通常は NULL に初期化されます。
2. ポインタ変数は通常の変数とは使い方が異なり、末尾が p であることが一般的です。
3. ポインタ変数の型によって、ポインタ変数を介してメモリにアクセスするときにアクセスされるバイト数が決まります。
4. ポインタ変数は連続して定義できません (1 つの * で定義できるポインタ変数は 1 つだけです):
int* p1,p2;
// p はポインタ、 p2 int 型変数です
int *p1,*p2;
// p1、p2 ともにポインタ変数
代入: ポインタ変数 = メモリ番号。変数名_p = アドレス;
メモリ番号はアクセス可能である必要があります。番号が間違っていると、セグメンテーション違反が発生する可能性があります。 void* は、任意のタイプのポインター (C ではない) に自動的に変換できます。アドレスが物理メモリ (マッピング) に対応していることを確認してください。そうでない場合は、セグメンテーション違反が発生します。
int* p = malloc(4); int* p = # // 引用内存
Access: *ポインタ変数 //逆参照----ポインタ変数にアクセス
ポインタ変数に格納されたメモリ番号に従って、対応するメモリにアクセスします。以前に割り当てられたメモリ番号が正しくない場合、このステップでセグメンテーション違反が発生します。アクセスされるバイトはポインタの型によって決まります。 int* p = # *p <=> num;
5, ポインタ算術
ポインタ変数は整数を格納するため、整数に使用できる演算子ポインタ変数です。 data 基本的には
を使用できますが、すべての操作が意味を持つわけではありません。
ポインタ + 整数 = ポインタの幅 * 整数
ポインタ - 整数 = ポインタ - 幅 * 整数 // ポインタは前後に移動します
ポインタ - ポインタ = (ポインタ - pointer) /Width//2 つのポインターの間にある要素の数
Pointer>、<、<=、>= ポインターは、2 つのポインターのうちどちらが前にあり、どちらが後ろにあるかを決定できます。
6, 配列とポインタ
. 配列名は特別なアドレスであり、ポインタとしても使用できます。配列名は定数です (配列名は配列の最初のアドレスに対応します)。配列の最初の要素)関係、通常のポインタは関係を指します)。配列名ではポインター逆参照を使用でき、ポインター変数では配列の [];arr[i] <=> *(arr i) を使用することもできます。関数の引数として配列を使用するとポインタ変数になるので長さが失われ安全性が低くなります void func(int * const arr, size_t len);
7, 高度な使い方ポインタの説明
配列ポインタとポインタ配列:
(1). 配列ポインタ (ポインタ): 配列を指すために特別に使用されるポインタ。
int arr[10]; int (*p)[10] = arr; int* p = #
void func(int I,int J,int(*arr)[J])
//二次元配列関数は配列ポインタを使用してパラメータを渡します
(2).ポインタ配列(array): 配列に格納されるデータ型はポインタです。
無秩序な離散データをまとめて要約します。
int* arr[3]; <=> int *p1,*p2,*p3;
(3). 二次値針: ポインタを指すto pointer
4. 関数ポインタ: 関数へのポインタ (逆参照不可)
9, const pointer
const int * p;
//ポインタが指すメモリ内のデータは、逆参照によって変更することはできません。
(1) 保護された関数のパラメータ
(2) ポインタが読み取り専用データを指している場合、ポインタは次のようにする必要があります。 const も追加すると、セグメンテーション違反が防止されます。
int const * p;
// 同上
int* const p;
// ポインタ変数の値は変更できません
可以防止指针变量意外变成野指针
const int* const p;
// 既保存指针所指针的内存,也保护指针变量
int const * const p;
// 同上
运行:
*p_num=10 请输入一个数字:1 *p_num是1 *ptr=10
10,注意事项:
空指针:
变量指针的值等于NULL,这种指针叫空指针。
不能对空指针解引用,一定会出现段错误。
当操作重启时会跳转NULL地址,进行重启,因此NULL存储操作系统用于重启的数据。
NULL在C语言中是一种错误标志,如果函数的返回值是指针类型,
结果一旦NULL表示函数执行出错或失败。
如何避免空指针造成的段错误?
使用来历不明(函数的参数)的指针前先进行检查,if(NULL == p)。
野指针:
指针变量的值不确定,使用野指针不一定会出错。
int* p; // 野指针
使用野指针的后果:段错误。
注意:野指针是无法分辨的,所以比空指针危害更。
如何避免野指针造成的错误?
所有的野指针都人制造出来的,只要人人都不制造野指针就会有野指针造成的错误。
定义指针变量时一定要初始化。
指针变量所指向的内存初始释放后要及时赋值为空(堆内存)。
不返回局部变量的地址。
相关学习推荐:C视频教程
以上がC言語でのポインタの使い方は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。