C ++ 11 NULLポインタ

導入の1 nullptr要。

典型的なポインタがヌルの位置を指すように初期化されます。例えば:

int型* my_ptr = 0;

int型* my_ptr = NULL;

一般に、NULLは、マクロ定義です。

#undefを NULL
 の#if定義された(__ CPLUSPLUS)
 の#define NULL 0
 の#else 
の#define NULL((void *型)0)
 #endifの

NULLリテラルは0として、または定義された型なしポインタ(ボイド*)定数として定義することができます。

コードは、NULLの使用による予期せぬ動作を示しています。

する#include <stdio.hの> ボイド F(CHAR * C){ 
  のprintf(" 呼び出しF(チャー*)\ n " ); 
} ボイド F(int型I){ 
  のprintf(" F(INT)\ Nを呼び出します" )。
} int型のmain(){ 
  F(0 )。
  F(NULL)。
  F((チャー *)0 )。リターン0 ; 
}







   

出力は次のようになります。

F(int)を呼び出します

F(INT)// NULL定義0リテラルタイプのいずれかのプラスチックであってもよく、あるいは非ポインタ型(ボイド*)であってもよい、0を引き起こし起動

Fを呼び出す(チャー*)

2.nullptr定義:

decltype(nullptr)nullptr_tのtypedef。

のnullptr上の共通のルール:

(1)すべてのデータ型が等価であるnullptr_tの定義は、動作は全く同じです。

(2)データのnullptr_tタイプは、暗黙的に任意の型のポインタに変換することができます。

(3)データのnullptr_t型は非ポインタ型に変換することができない、reinterpret_castは場合でも<nullptr_t>()途中でできません。

(4)nullptr_t型データは、算術式では使用できません

(5)データのnullptr_tタイプは、リレーショナル演算式に使用されるが、唯一nullptr_t型データまたはポインタデータ型と比較することができます。

#include <iostreamの> 
する#include <のTypeInfo>
 使用して 名前空間STD; 

int型のmain(){
   チャー *のCP = nullptr; 

  //は整数に変換できない
   // INT N1 = nullptr;
   // INT reinterpret_castはN2 = <整数>( nullptr A); 


  // nullptr比較は、タイプnullptr_tを用いて作製することができる
  にnullptr_tのnptrの、
   IF(== nptrのがするnullptr A){ 
    COUT << " ==をnullptrするnullptr_t nptrの" << ENDL; 
  } { 
    COUT << " != nullptr nullptr_tするnptrの" <<ENDL; 
  } 

  IF(nptrのに< nullptr A){ 
    COUT << " nullptr_t nptrのに<nullptr " << ENDL; 
  } { 
    COUT << " nullptr_t nptrのに<nullptr!" << ENDL; 
  } 

  // ブール型に変換することができない
   // (nullptr == 0)IF
   // IF(nullptr A)

  // 行わない算術
   // nullptr A + = 1;
   // *をnullptr 5 

  // 以下正常に動作
  はsizeof (nullptr a)は、
  型ID(nullptr A)、
  スロー( nullptr);

  リターン 0 ; 

}

 3.ルールを議論します

C ++ 11標準、同じ空で占められnullptr型のデータメモリ空間*。

sizeof(nullptr_t)==はsizeof(void *型)

nullptrは、その名のキーワードコンパイル時でコンパイル時定数であり、コンパイラによって認識することができます。

おすすめ

転載: www.cnblogs.com/sssblog/p/11458113.html
おすすめ