Cポインタのメモ

ポインタ


ポインタ型

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)。

 

おすすめ

転載: www.cnblogs.com/ren-hang/p/12644182.html