<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=C%2B%2B%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF</id>
	<title>C++の基礎 - ポインタ - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=C%2B%2B%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF"/>
	<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=C%2B%2B%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF&amp;action=history"/>
	<updated>2026-09-05T19:09:34Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://mochiu.net/index.php?title=C%2B%2B%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF&amp;diff=13629&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == C++において、ポインタはメモリアドレスを格納する変数である。&lt;br&gt; &lt;br&gt; ポインタを使用することにより、動的なメモリ確保やデータの効率的な操作が可能になるが、&lt;br&gt; 適切に扱わなければメモリリークやダングリングポインタ等の問題を引き起こす危険性がある。&lt;br&gt; &lt;br&gt; ポインタは、C++の基本的かつ重要な機能であり、以下に示すような…」</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=C%2B%2B%E3%81%AE%E5%9F%BA%E7%A4%8E_-_%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF&amp;diff=13629&amp;oldid=prev"/>
		<updated>2025-12-01T06:28:57Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == C++において、ポインタはメモリアドレスを格納する変数である。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; ポインタを使用することにより、動的なメモリ確保やデータの効率的な操作が可能になるが、&amp;lt;br&amp;gt; 適切に扱わなければメモリリークやダングリングポインタ等の問題を引き起こす危険性がある。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; ポインタは、C++の基本的かつ重要な機能であり、以下に示すような…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
C++において、ポインタはメモリアドレスを格納する変数である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ポインタを使用することにより、動的なメモリ確保やデータの効率的な操作が可能になるが、&amp;lt;br&amp;gt;&lt;br /&gt;
適切に扱わなければメモリリークやダングリングポインタ等の問題を引き起こす危険性がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ポインタは、C++の基本的かつ重要な機能であり、以下に示すような場面で使用される。&amp;lt;br&amp;gt;&lt;br /&gt;
* 動的なメモリ確保&lt;br /&gt;
* 関数への参照渡し&lt;br /&gt;
* 配列やデータ構造の操作&lt;br /&gt;
* ポリモーフィズムの実現&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ポインタとは ==&lt;br /&gt;
ポインタとは、メモリアドレスを格納する変数である。&amp;lt;br&amp;gt;&lt;br /&gt;
通常の変数がデータそのものを格納するのに対し、ポインタはデータが格納されているメモリ上の場所 (アドレス) を格納する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ポインタは、以下に示すような特徴を持っている。&amp;lt;br&amp;gt;&lt;br /&gt;
* メモリアドレスを格納する。&lt;br /&gt;
* 間接参照演算子(*)を使って、ポインタが指すメモリの値にアクセスできる。&lt;br /&gt;
* アドレス演算子(&amp;amp;)を使って、変数のアドレスを取得できる。&lt;br /&gt;
* 動的にメモリを確保・解放することができる。&lt;br /&gt;
* nullptrを代入することで、何も指していない状態を表現できる。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 #include&amp;lt;iostream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
    // 通常の変数の宣言&lt;br /&gt;
    int value = 10;&lt;br /&gt;
 &lt;br /&gt;
    // ポインタの宣言と初期化&lt;br /&gt;
    // valueのアドレスをptrに格納する&lt;br /&gt;
    int* ptr = &amp;amp;value;&lt;br /&gt;
 &lt;br /&gt;
    // ポインタが指す値を表示&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;valueの値: &amp;quot; &amp;lt;&amp;lt; value &amp;lt;&amp;lt; std::endl;        // 10が表示される&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;valueのアドレス: &amp;quot; &amp;lt;&amp;lt; &amp;amp;value &amp;lt;&amp;lt; std::endl; // メモリアドレスが表示される&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;ptrの値(アドレス): &amp;quot; &amp;lt;&amp;lt; ptr &amp;lt;&amp;lt; std::endl;  // valueと同じアドレスが表示される&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;ptrが指す値: &amp;quot; &amp;lt;&amp;lt; *ptr &amp;lt;&amp;lt; std::endl;       // 10が表示される&lt;br /&gt;
 &lt;br /&gt;
    // ポインタを通じて値を変更&lt;br /&gt;
    // ptrが指すメモリの値を20に変更する&lt;br /&gt;
    *ptr = 20;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;変更後のvalueの値: &amp;quot; &amp;lt;&amp;lt; value &amp;lt;&amp;lt; std::endl; // 20が表示される&lt;br /&gt;
 &lt;br /&gt;
    // nullptrの使用&lt;br /&gt;
    // 何も指していないポインタを宣言&lt;br /&gt;
    int* ptr2 = nullptr;&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ポインタの使い方 ==&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 // ポインタの宣言には、型名の後にアスタリスク(*)を付ける&lt;br /&gt;
 int* ptr1;     // int型へのポインタ&lt;br /&gt;
 double* ptr2;  // double型へのポインタ&lt;br /&gt;
 char* ptr3;    // char型へのポインタ&lt;br /&gt;
 &lt;br /&gt;
 // ポインタの初期化&lt;br /&gt;
 int value = 100;&lt;br /&gt;
 int* ptr = &amp;amp;value;  // アドレス演算子(&amp;amp;)で変数のアドレスを取得&lt;br /&gt;
 &lt;br /&gt;
 // nullptrで初期化することもできる&lt;br /&gt;
 // nullptrは何も指していない状態を表す&lt;br /&gt;
 int* ptr4 = nullptr;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 // 間接参照演算子(*)を使用して、ポインタが指す値にアクセスできる&lt;br /&gt;
 int value = 10;&lt;br /&gt;
 int* ptr = &amp;amp;value;&lt;br /&gt;
 &lt;br /&gt;
 // ポインタを通じて値を読み取る&lt;br /&gt;
 // *ptrは、ptrが指すメモリの値を表す&lt;br /&gt;
 int readValue = *ptr;  // readValueは10&lt;br /&gt;
 &lt;br /&gt;
 // ポインタを通じて値を変更する&lt;br /&gt;
 // *ptrに代入すると、ptrが指すメモリの値が変更される&lt;br /&gt;
 *ptr = 20;  // valueの値が20になる&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 // 動的メモリ確保には、new演算子を使用する&lt;br /&gt;
 // メモリの解放には、delete演算子を使用する&lt;br /&gt;
 &lt;br /&gt;
 // int型のメモリをヒープ領域に動的に確保&lt;br /&gt;
 // new int(10)は、10で初期化されたint型のメモリを確保し、そのアドレスを返す&lt;br /&gt;
 int* ptr = new int(10);&lt;br /&gt;
 &lt;br /&gt;
 // ポインタを使用&lt;br /&gt;
 std::cout &amp;lt;&amp;lt; *ptr &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 &lt;br /&gt;
 // メモリを解放&lt;br /&gt;
 // 動的に確保したメモリは、必ずdeleteで解放する必要がある&lt;br /&gt;
 delete ptr;&lt;br /&gt;
 &lt;br /&gt;
 // 解放後はnullptrを代入するのが安全&lt;br /&gt;
 // これにより、ダングリングポインタを防げる&lt;br /&gt;
 ptr = nullptr;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 // 配列の動的確保には、new[]演算子を使用する&lt;br /&gt;
 // 配列の解放には、delete[]演算子を使用する&lt;br /&gt;
 &lt;br /&gt;
 // int型配列の要素数10をヒープ領域に動的に確保&lt;br /&gt;
 int* array = new int[10];&lt;br /&gt;
 &lt;br /&gt;
 // 配列に値を代入&lt;br /&gt;
 // ポインタでも添字演算子[]を使用できる&lt;br /&gt;
 for(int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
 {&lt;br /&gt;
    array[i] = i * 2;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 配列の値を表示&lt;br /&gt;
 for(int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
 {&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; array[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 std::cout &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 &lt;br /&gt;
 // 配列のメモリを解放(delete[]を使用)&lt;br /&gt;
 // new[]で確保したメモリは、必ずdelete[]で解放する&lt;br /&gt;
 delete[] array;&lt;br /&gt;
 array = nullptr;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 // クラスのメンバにアクセスするには、アロー演算子(-&amp;gt;)を使用する&lt;br /&gt;
 class MyClass&lt;br /&gt;
 {&lt;br /&gt;
    public:&lt;br /&gt;
       int value;&lt;br /&gt;
       void print() { std::cout &amp;lt;&amp;lt; value &amp;lt;&amp;lt; std::endl; }&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 // クラスのインスタンスを動的に確保&lt;br /&gt;
 MyClass* ptr = new MyClass();&lt;br /&gt;
 &lt;br /&gt;
 // アロー演算子でメンバにアクセス&lt;br /&gt;
 // ptr-&amp;gt;valueは、(*ptr).valueと同じ意味&lt;br /&gt;
 ptr-&amp;gt;value = 100;&lt;br /&gt;
 ptr-&amp;gt;print();&lt;br /&gt;
 &lt;br /&gt;
 // (*ptr).valueのように書くこともできるが、-&amp;gt;の方が簡潔で読みやすい&lt;br /&gt;
 (*ptr).value = 200;&lt;br /&gt;
 &lt;br /&gt;
 // メモリを解放&lt;br /&gt;
 delete ptr;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 関数の引数 ==&lt;br /&gt;
関数に大きなデータを渡す時や、関数内で値を変更したい時にポインタを使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
値渡しではデータのコピーが発生するが、ポインタ渡しではアドレスのみを渡すため効率的である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 // 値を変更する関数&lt;br /&gt;
 // ポインタを引数に取ることで、呼び出し元の変数を直接変更できる&lt;br /&gt;
 void increment(int* ptr)&lt;br /&gt;
 {&lt;br /&gt;
    (*ptr)++;  // ポインタが指す値をインクリメント&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
    int value = 10;&lt;br /&gt;
    // valueのアドレスを渡す&lt;br /&gt;
    // 関数内でvalueの値が変更される&lt;br /&gt;
    increment(&amp;amp;value);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; value &amp;lt;&amp;lt; std::endl;  // 11が表示される&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 動的メモリ確保 ==&lt;br /&gt;
実行時にサイズが決まる配列や、大きなデータ構造を扱う場合にポインタを使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
スタック領域は限られているため、大きなデータはヒープ領域に動的に確保する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
    int size;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;配列のサイズを入力: &amp;quot;;&lt;br /&gt;
    std::cin &amp;gt;&amp;gt; size;&lt;br /&gt;
 &lt;br /&gt;
    // 実行時にサイズが決まる配列を動的に確保&lt;br /&gt;
    // スタック配列と異なり、実行時に決定したサイズで配列を作成できる&lt;br /&gt;
    int* array = new int[size];&lt;br /&gt;
 &lt;br /&gt;
    // 配列を使用&lt;br /&gt;
    for(int i = 0; i &amp;lt; size; i++)&lt;br /&gt;
    {&lt;br /&gt;
       array[i] = i;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // メモリを解放&lt;br /&gt;
    // 動的に確保したメモリは必ず解放する&lt;br /&gt;
    delete[] array;&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ポリモーフィズム ====&lt;br /&gt;
基底クラスのポインタを使って、派生クラスのオブジェクトを扱う場合にポインタを使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
これにより、実行時に適切な関数が呼び出される動的な多態性が実現できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 class Base&lt;br /&gt;
 {&lt;br /&gt;
    public:&lt;br /&gt;
       virtual void print() { std::cout &amp;lt;&amp;lt; &amp;quot;Base&amp;quot; &amp;lt;&amp;lt; std::endl; }&lt;br /&gt;
       // 仮想デストラクタを定義することで、適切にメモリが解放される&lt;br /&gt;
       virtual ~Base() {}&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 class Derived : public Base&lt;br /&gt;
 {&lt;br /&gt;
    public:&lt;br /&gt;
       // 基底クラスの仮想関数をオーバーライド&lt;br /&gt;
       void print() override { std::cout &amp;lt;&amp;lt; &amp;quot;Derived&amp;quot; &amp;lt;&amp;lt; std::endl; }&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
    // 基底クラスのポインタで派生クラスのオブジェクトを指す&lt;br /&gt;
    Base* ptr = new Derived();&lt;br /&gt;
    // 実行時に派生クラスのprint関数が呼び出される&lt;br /&gt;
    ptr-&amp;gt;print();  // &amp;quot;Derived&amp;quot;と表示される&lt;br /&gt;
    delete ptr;&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ポインタの注意点 ==&lt;br /&gt;
==== メモリリーク ====&lt;br /&gt;
動的に確保したメモリを解放しないと、メモリリークが発生する。&amp;lt;br&amp;gt;&lt;br /&gt;
プログラムが終了するまでメモリが占有され続け、システムのメモリが枯渇する可能性がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 // メモリリークの例&lt;br /&gt;
 void memoryLeak()&lt;br /&gt;
 {&lt;br /&gt;
    int* ptr = new int(10);&lt;br /&gt;
    // deleteを忘れている!&lt;br /&gt;
    // 関数終了時にptrは消えるが、確保したメモリは残り続ける&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 正しい使い方&lt;br /&gt;
 void noMemoryLeak()&lt;br /&gt;
 {&lt;br /&gt;
    int* ptr = new int(10);&lt;br /&gt;
    // 必ずdeleteする&lt;br /&gt;
    // これによりメモリが適切に解放される&lt;br /&gt;
    delete ptr;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ダングリングポインタ ====&lt;br /&gt;
解放済みのメモリを指すポインタをダングリングポインタと呼ぶ。&amp;lt;br&amp;gt;&lt;br /&gt;
ダングリングポインタを使用すると、未定義動作を引き起こす。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 int* ptr = new int(10);&lt;br /&gt;
 delete ptr;&lt;br /&gt;
 // この時点でptrはダングリングポインタ&lt;br /&gt;
 // ptrはまだアドレスを保持しているが、そのメモリは解放済み&lt;br /&gt;
 &lt;br /&gt;
 // *ptr = 20;  // 未定義動作! 絶対にやってはいけない&lt;br /&gt;
 &lt;br /&gt;
 // 解放後はnullptrを代入する&lt;br /&gt;
 // これによりダングリングポインタを防げる&lt;br /&gt;
 ptr = nullptr;&lt;br /&gt;
 &lt;br /&gt;
 // nullptrチェックで安全に使用できる&lt;br /&gt;
 if(ptr != nullptr)&lt;br /&gt;
 {&lt;br /&gt;
    *ptr = 20;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 二重解放 ====&lt;br /&gt;
同じメモリを2回以上解放すると、プログラムがクラッシュする可能性がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 int* ptr = new int(10);&lt;br /&gt;
 delete ptr;&lt;br /&gt;
 // delete ptr;  // 二重解放! プログラムがクラッシュする可能性&lt;br /&gt;
 &lt;br /&gt;
 // 解放後にnullptrを代入すれば、二重解放を防げる&lt;br /&gt;
 ptr = nullptr;&lt;br /&gt;
 // nullptrのdeleteは安全(何もしない)&lt;br /&gt;
 delete ptr;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== nullポインタの参照 ====&lt;br /&gt;
nullptrや未初期化のポインタを参照すると、プログラムがクラッシュする。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 int* ptr = nullptr;&lt;br /&gt;
 // *ptr = 10;  // クラッシュする!&lt;br /&gt;
 &lt;br /&gt;
 // 使用前にnullptrチェックを行う&lt;br /&gt;
 // これにより安全にポインタを使用できる&lt;br /&gt;
 if(ptr != nullptr)&lt;br /&gt;
 {&lt;br /&gt;
    *ptr = 10;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // または、ポインタを必ず有効な値で初期化する&lt;br /&gt;
 int value = 0;&lt;br /&gt;
 int* ptr2 = &amp;amp;value;  // 有効なアドレスで初期化&lt;br /&gt;
 *ptr2 = 10;  // 安全&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 配列のdelete ====&lt;br /&gt;
new[]で確保したメモリは、delete[]で解放する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
deleteとdelete[]を混同すると、未定義動作を引き起こす。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 // 単一のオブジェクト&lt;br /&gt;
 // newで確保したメモリはdeleteで解放&lt;br /&gt;
 int* ptr1 = new int(10);&lt;br /&gt;
 delete ptr1;  // OK&lt;br /&gt;
 &lt;br /&gt;
 // 配列&lt;br /&gt;
 // new[]で確保したメモリはdelete[]で解放&lt;br /&gt;
 int* ptr2 = new int[10];&lt;br /&gt;
 delete[] ptr2;  // OK&lt;br /&gt;
 &lt;br /&gt;
 // 間違った例&lt;br /&gt;
 // int* ptr3 = new int[10];&lt;br /&gt;
 // delete ptr3;  // 未定義動作! delete[]を使う必要がある&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ポインタと配列の違い ==&lt;br /&gt;
ポインタと配列は密接に関連しているが、重要な違いがいくつか存在する。&amp;lt;br&amp;gt;&lt;br /&gt;
これらの違いを理解することで、ポインタと配列を適切に使い分けることができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 宣言と初期化 ====&lt;br /&gt;
配列は宣言時にサイズが固定され、連続したメモリ領域が確保される。&amp;lt;br&amp;gt;&lt;br /&gt;
ポインタは単にアドレスを格納する変数であり、初期化時にメモリを指すように設定する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 // 配列の宣言&lt;br /&gt;
 // コンパイル時にサイズが決まり、スタック領域に確保される&lt;br /&gt;
 int array[10];&lt;br /&gt;
 &lt;br /&gt;
 // ポインタの宣言&lt;br /&gt;
 // ポインタ変数自体はスタックに確保されるが、何も指していない&lt;br /&gt;
 int* ptr;&lt;br /&gt;
 &lt;br /&gt;
 // ポインタを使った動的配列&lt;br /&gt;
 // 実行時にサイズを決定でき、ヒープ領域に確保される&lt;br /&gt;
 ptr = new int[10];&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== メモリの配置 ====&lt;br /&gt;
配列名は、その配列の先頭要素のアドレスを表す定数である。&amp;lt;br&amp;gt;&lt;br /&gt;
ポインタは変数であり、別のアドレスを代入することができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 int array[10];&lt;br /&gt;
 int* ptr = array;  // 配列の先頭アドレスをポインタに代入&lt;br /&gt;
 &lt;br /&gt;
 // 配列名は定数なので、別のアドレスを代入できない&lt;br /&gt;
 // array = ptr;  // エラー! 配列名は定数&lt;br /&gt;
 &lt;br /&gt;
 // ポインタは変数なので、別のアドレスを代入できる&lt;br /&gt;
 int another[10];&lt;br /&gt;
 ptr = another;  // OK&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== sizeof演算子の結果 ====&lt;br /&gt;
sizeof演算子を使った時、配列とポインタでは異なる結果が返される。&amp;lt;br&amp;gt;&lt;br /&gt;
配列に対してsizeofを使うと、配列全体のサイズが返される。&amp;lt;br&amp;gt;&lt;br /&gt;
ポインタに対してsizeofを使うと、ポインタ変数自体のサイズが返される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 int array[10];&lt;br /&gt;
 int* ptr = array;&lt;br /&gt;
 &lt;br /&gt;
 // 配列のサイズ&lt;br /&gt;
 // int型のサイズ×要素数が返される&lt;br /&gt;
 std::cout &amp;lt;&amp;lt; sizeof(array) &amp;lt;&amp;lt; std::endl;  // 40バイト (int型が4バイトの場合)&lt;br /&gt;
 &lt;br /&gt;
 // ポインタのサイズ&lt;br /&gt;
 // ポインタ変数自体のサイズが返される&lt;br /&gt;
 std::cout &amp;lt;&amp;lt; sizeof(ptr) &amp;lt;&amp;lt; std::endl;    // 8バイト (64ビットシステムの場合)&lt;br /&gt;
 &lt;br /&gt;
 // 配列の要素数を計算&lt;br /&gt;
 int arraySize = sizeof(array) / sizeof(array[0]);&lt;br /&gt;
 std::cout &amp;lt;&amp;lt; arraySize &amp;lt;&amp;lt; std::endl;  // 10&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ポインタ演算 ====&lt;br /&gt;
配列名もポインタも、ポインタ演算を使用できる。&amp;lt;br&amp;gt;&lt;br /&gt;
ただし、配列名は定数なので、インクリメントやデクリメントはできない。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};&lt;br /&gt;
 int* ptr = array;&lt;br /&gt;
 &lt;br /&gt;
 // 配列名を使ったアクセス&lt;br /&gt;
 std::cout &amp;lt;&amp;lt; array[0] &amp;lt;&amp;lt; std::endl;      // 0&lt;br /&gt;
 std::cout &amp;lt;&amp;lt; *(array + 2) &amp;lt;&amp;lt; std::endl;  // 2&lt;br /&gt;
 &lt;br /&gt;
 // ポインタを使用したアクセス&lt;br /&gt;
 std::cout &amp;lt;&amp;lt; *ptr &amp;lt;&amp;lt; std::endl;          // 0&lt;br /&gt;
 std::cout &amp;lt;&amp;lt; *(ptr + 2) &amp;lt;&amp;lt; std::endl;    // 2&lt;br /&gt;
 &lt;br /&gt;
 // ポインタはインクリメントできる&lt;br /&gt;
 ptr++;  // OK  次の要素を指すようになる&lt;br /&gt;
 std::cout &amp;lt;&amp;lt; *ptr &amp;lt;&amp;lt; std::endl;  // 1&lt;br /&gt;
 &lt;br /&gt;
 // 配列名はインクリメントできない&lt;br /&gt;
 // array++;  // エラー! 配列名は定数&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== メモリの解放 ====&lt;br /&gt;
スタックに確保された配列は、スコープを抜けると自動的に解放される。&amp;lt;br&amp;gt;&lt;br /&gt;
ポインタで動的に確保したメモリは、明示的に delete または delete[] で解放する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 void stackArray()&lt;br /&gt;
 {&lt;br /&gt;
    int array[10];&lt;br /&gt;
    // arrayを使用&lt;br /&gt;
    // 関数終了時に自動的に解放される&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void heapArray()&lt;br /&gt;
 {&lt;br /&gt;
    int* ptr = new int[10];&lt;br /&gt;
    // ptrを使用&lt;br /&gt;
    &lt;br /&gt;
    // 明示的に解放する必要がある&lt;br /&gt;
    delete[] ptr;&lt;br /&gt;
    // 解放を忘れるとメモリリークが発生する&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 関数の引数としての配列とポインタ ====&lt;br /&gt;
関数の引数として配列を渡すと、実際にはポインタとして渡される。&amp;lt;br&amp;gt;&lt;br /&gt;
このため、関数内で配列のサイズを知ることはできない。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 // 配列を引数に取る関数&lt;br /&gt;
 // 実際にはポインタとして渡される&lt;br /&gt;
 void printArray(int arr[], int size)&lt;br /&gt;
 {&lt;br /&gt;
    // sizeof(arr)はポインタのサイズを返すので、要素数は計算できない&lt;br /&gt;
    // そのため、サイズを別の引数で渡す必要がある&lt;br /&gt;
    for(int i = 0; i &amp;lt; size; i++)&lt;br /&gt;
    {&lt;br /&gt;
       std::cout &amp;lt;&amp;lt; arr[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
    int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};&lt;br /&gt;
    &lt;br /&gt;
    // 配列と、そのサイズを渡す&lt;br /&gt;
    printArray(array, 10);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 多次元配列 ====&lt;br /&gt;
配列とポインタでは、多次元配列の扱い方が異なる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 // 2次元配列の宣言&lt;br /&gt;
 int array2D[3][4];&lt;br /&gt;
 &lt;br /&gt;
 // ポインタを使った2次元配列&lt;br /&gt;
 // まず、ポインタの配列を確保&lt;br /&gt;
 int** ptr2D = new int*[3];&lt;br /&gt;
 // 次に、各行に配列を確保&lt;br /&gt;
 for(int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
 {&lt;br /&gt;
    ptr2D[i] = new int[4];&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 値の代入はどちらも同じ&lt;br /&gt;
 array2D[1][2] = 10;&lt;br /&gt;
 ptr2D[1][2] = 10;&lt;br /&gt;
 &lt;br /&gt;
 // ポインタで確保した2次元配列の解放&lt;br /&gt;
 // 各行を解放してから、ポインタの配列を解放&lt;br /&gt;
 for(int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
 {&lt;br /&gt;
    delete[] ptr2D[i];&lt;br /&gt;
 }&lt;br /&gt;
 delete[] ptr2D;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 配列との比較 ==&lt;br /&gt;
静的配列とポインタによる動的配列には、それぞれ利点がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
静的配列を使用する方法は、スタック領域に確保されるため、高速にアクセスできる。&amp;lt;br&amp;gt;&lt;br /&gt;
また、メモリの解放を意識する必要がない。&amp;lt;br&amp;gt;&lt;br /&gt;
ただし、コンパイル時にサイズが決まっている必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ポインタを使用する方法は、実行時にサイズを決定できる。&amp;lt;br&amp;gt;&lt;br /&gt;
また、大きなデータをヒープ領域に確保できる。&amp;lt;br&amp;gt;&lt;br /&gt;
ただし、メモリの解放を明示的に行う必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
静的配列は、サイズが固定で小さいデータに適している。&amp;lt;br&amp;gt;&lt;br /&gt;
ポインタによる動的配列は、実行時にサイズが決まる場合や、大きなデータを扱う場合に適している。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ただし、現代のC++では、std::vector や std::array等のコンテナクラスの使用が推奨される。&amp;lt;br&amp;gt;&lt;br /&gt;
これらのクラスは、メモリ管理を自動化し、より安全で使いやすいインターフェースを提供する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 例 : 動的配列の使用 ====&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
    int size;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;要素数を入力してください: &amp;quot;;&lt;br /&gt;
    std::cin &amp;gt;&amp;gt; size;&lt;br /&gt;
 &lt;br /&gt;
    // 動的に配列を確保&lt;br /&gt;
    // ユーザが入力したサイズで配列を作成できる&lt;br /&gt;
    int* array = new int[size];&lt;br /&gt;
 &lt;br /&gt;
    // 配列に値を代入&lt;br /&gt;
    for(int i = 0; i &amp;lt; size; i++)&lt;br /&gt;
    {&lt;br /&gt;
       array[i] = (i + 1) * 10;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // 配列の内容を表示&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;配列の内容: &amp;quot;;&lt;br /&gt;
    for(int i = 0; i &amp;lt; size; i++)&lt;br /&gt;
    {&lt;br /&gt;
       std::cout &amp;lt;&amp;lt; array[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 &lt;br /&gt;
    // 配列の平均値を計算&lt;br /&gt;
    double sum = 0;&lt;br /&gt;
    for(int i = 0; i &amp;lt; size; i++)&lt;br /&gt;
    {&lt;br /&gt;
       sum += array[i];&lt;br /&gt;
    }&lt;br /&gt;
    double average = sum / size;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;平均値: &amp;quot; &amp;lt;&amp;lt; average &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 &lt;br /&gt;
    // メモリを解放&lt;br /&gt;
    // 動的に確保したメモリは必ず解放する&lt;br /&gt;
    delete[] array;&lt;br /&gt;
    array = nullptr;&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:C++]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>