ポインタ
ポインタ型
XX タイプ+ *→XXのポインタ型
int型* シェーピングポインタ型
char * charポインタ型
ポインタ変数
変数ポインタは、ポインタ変数の型宣言であります
int型; //は、整数変数を宣言します
int型は、*; // 整数型変数へのポインタを宣言します
ポインタ変数の代入
ポインタ変数は、変数代入原理のメモリアドレスに格納されている:ポインタ変数のどのようなタイプは、対応するタイプの変数値のアドレスを与えられるべきです。
①int型* P = 0x40003a04; // 簡単な解釈
int型②; チャーB = 'B'; int型* P1 =&; char * P2 =&B;
メモリアドレス
記憶手段は、 RAM 等、通常16進数で表現さの特定の位置に0x40003a04。
で 32ビットCPU 、アドレスは32 ビットの符号なし整数で、表すことができる2 ^ 32(4 GB)アドレス。
自然のポインタ
かかわらず、ポインタのタイプのアドレスは、対応する変数のアドレスを指し、格納する必要があり、アドレス値は 32 ポインタサイズの任意のタイプであり、ビットの符号なし整数4 バイト。
ポインタ型 →unsigned int型
一般的なポインタ型
タイプ |
int型 |
CHAR |
浮く |
ダブル |
{INT、INT B;}構造体A |
空FUNC() |
ポインタ型 |
int型* |
CHAR * |
浮く* |
ダブル* |
構造体A * |
typedefは無効(* PFUNC)() |
ポインタを定義し、初期化します
int型* P1 = NULL;
char * P1 = NULL;
フロート* P1 = NULL;
ダブル* P1 = NULL;
ポインタ変数の代入
int型、A = 5; int型* P1 =&;
ポインタ変数の値を取得する変数を参照し
使用* ポインタ変数の値を取得します。
printf(「%d個」、* P1)。
* 2つの用途
タイプ* |
ポインタ型 |
* ポインタ変数 |
フェッチポインタ変数の値を示しました |
ポインタ型構造タイプ
タイプ |
{INT、INT B;}構造体A |
ポインタ型 |
構造体A * |
構造体のポインタ変数の定義
構造体A * P = NULL;
構造体変数のアドレスを取得します
{INT、INT B;}構造体A。
Aストラクト;
printf(「%のP」、&)。
使用 * 取得構造のポインタ変数の値
INT構造体A {。int型B; }。
構造体A、A = {5,6}。
構造体A * P =&;
printf(「%のDは、%D」、(* P).A、(* P).B)。
ポインタ変数のアクセス構造体のメンバを使用して
- > 構造体のメンバ変数への参照
INT構造体A {。int型B; }。
構造体A、A = {5,6}。
構造体A * P =&;
printf(「%dを、%のD」、P-> A、P> B)。
関数ポインタ:ポインタのシンボル * 関数名の前に
関数:ボイドFUNC(){のprintf( "FUNC \ N-");}
関数のアドレス
次の二つを取るために同じアドレス:最初のアドレスである関数名、場合:
printf(「%のP \ n」は、FUNC)。
printf(「%pを\ n」は、&FUNC)。
関数ポインタ型は、なしのtypedefを表す関数ポインタ変数を定義します
関数原型 |
空FUNC() |
ポインタ型 |
typedefは無効(* PFUNC)() |
関数ポインタ代入
PFUNC P = FUNC; またはPFUNCのP =&FUNC。
関数ポインタ変数を使用して関数を呼び出します
PFUNC P = FUNC。
P(); //は呼び出すFUNC 機能を
複雑な関数ポインタ
int型(*(* P)(int型))(int型);
例えば。typedef int型(*(* pFunc3)(int型))(int型);
pFunc3 FUNC3 = FUNC。
ワイルドポインタ
違法なポインタ・メモリ領域
① メモリにポイントが破壊されています
② ポイントは、アクセス・メモリを持っていません
①int* P =(INT *)のmalloc(INT)。
無料(P); // 今回のp フィールドがポインタとなっている、アドレスの値を取り、ディストーション
② ランダムPの不確実性の未知のメモリ領域を指し、微妙な原因、メモリを変更する原因となるバグやシステムクラッシュ
ポインタのダングリング避けます
① アプリケーション初期化ポインタ:INT * P = NULL ;
② メモリ・ポインタに設定された後に解放NULL :フリー(P); P = NULL;
ポインタ演算:加算 / 減算
ポインタ添加:ポインタ + N :示すポインタ値+ N *はsizeof(タイプ)バイト
もしあなたあなたあなた
↑↑
int型* Pのp + 3
ポインタの添加: ++ ポインタ:示すポインタ値+ はsizeof(タイプ)ポインタ実行した後、バイトのp 値が変化します
もしあなたあなたあなた
↑↑
int型*のp ++ P
ポインタ減算方法:ポインタ -N :示すポインタ値マイナス N *はsizeof(タイプ)バイト
もしあなたあなたあなた
↑↑
P-3のint * P
ポインタ減算方法: - ポインタ:ポインタを差し引いた値を示してはsizeof(タイプ)ポインタ実行した後、バイトのp 値が変化します
もしあなたあなたあなた
↑↑
- P int型* P
ポインタ - ポインタは:アドレス値を減算した2つのバイトの数を示している:P2 = P1を-3-。
もしあなたあなたあなた
↑↑
int型* P1のint * p2の
一次元配列
INT [5] = {1,2,3,4,5は }、 連続したメモリ空間、1バイトのアレイ内の各値を占めます。
最初のアドレス一次元アレイは、名前または最初のエレメントのアドレスのアレイです。
INT [5] = {1,2,3,4,5}。
int型* P =。
INT * P =&[0]。
ポインタと配列名との間の差
タイプ |
かどうかの変数 |
計算可能 |
配列名 |
不変、それは一定であり、 |
できません++ 、- |
ポインタ |
変更することができ、それが変数であります |
かもしれ++ 、- |
アクセス配列要素へのポインタを使用します
(I ++; I <5 I = 0の整数)のために
{
printf(「%dの\ n」は、* I +(P))。
}
(I ++; I <5 I = 0の整数)のために
{
printf(「%d個\ n」は、*(P ++));
}
(I ++; I <5 I = 0の整数)のために
{
printf( "%dの\ n" 、*(+ I)); // 配列名を添加することにより、変化しない、一定である私はない減算、オフセット値
}
二次元配列
INT [2] [3] = {{1,2,3}、{4,5,6}}。
[0] → 1 2 3
[1] → 4 5 6
最初のアドレスの二次元アレイは、名前または最初のエレメントのアドレスのアレイです。
定義された2次元配列ポインタ
ポインタの点の二次元アレイ:行ポインタ →タイプ(* P)[N]
INT [2] [3] = {{1,2,3}、{4,5,6}}。
INT(* P)[3]。
P = A; // 配列名を割り当てます
P =&[0]; // 最初の要素の最初のアドレスへのポインタ
要素のアクセス2次元配列へのポインタを使用します
(I ++; I <2 I = 0の整数)のために
以下のための(int型J = 0; jの<3; J ++)
{のprintf(「%dの\ n」は、P [I] [J])。}
(I ++; I <2 I = 0の整数)のために
以下のための(int型J = 0; jの<3; J ++)
{のprintf( "%dの\ n "、*(P [I] + J));} // P [i]はローポインタの代表、P [i]は配列名と見
(I ++; I <2 I = 0の整数)のために
以下のための(int型J = 0; jの<3; J ++)
{のprintf(「%D \ n」、*(*(P + I)+ J))。}
[M] [n]は等価な表現であります
タイプ |
ポインタの定義 |
割り当て |
行ポインタ |
INT(* P)[N] |
&[N] |
普通のポインタ |
int型* |
[N] - [M] [N] |
文字列定数のアドレスそのものであります
ハローにメモリに保存されているハロー\ 0
文字列定数の本質は、メモリのセクション、識別するための最初のアドレスであり、文字列定数の値を変更することはできません
文字列ポインタ
CHAR * P = "こんにちは"; 使用しない[1] P = ; 'A' の変更内容を
ポインタ変数の文字列定数先頭アドレスに与えます。
(I ++; I <5 I = 0の整数)のために
{のprintf(「%のC \ n」は、P [I])。}
(I ++; I <5 I = 0の整数)のために
{のprintf(「%のC \ n」は、* I +(P))。}
(I ++; I <5 I = 0の整数)のために
{のprintf(「%のCする\ n」、*(p ++))。}
ポインタのポインタ
ポインタ変数は、メモリアドレスもあり、メモリを取ります
ポインタ型:
XX タイプ * → XXのポインタ型
XX タイプ* * → XXポインタ型 // ポインタ型
int型** // int型のポインタのポインタ
文字** // 文字型ポインタのポインタ型
フロート** // 浮動小数点型はポインタ型へのポインタ
例えば。
int型、A = 10;
int型* p =&;
int型** P =&P;
使用、ボイド-parameters
void *型は、アドレスの任意の型を渡すことができます
空FUNC(void *型のp)
{// pは実際の型に変換しました}
キャストポインタ変数
int型、A = 5;
int型* p =&;
INT C =(INT)P。
int型* P2 =(int型*)C;
キャストポインタ変数
チャーBUF [256]
int型* P =(int型*)BUF。
* P = 123。
printf(「%d個\ n」は、* P);
チャーBUF [256]
{INT、INT B;}構造体A。
* P =(A *)BUF。
P-> A = 12。
P-> B = 34。
printf(「%d個、%D \ n」は、P-> A、P> B)。