1-16-0. ポインタ

公開日: 17:43 1. 基本編/1-16. ポインタ/1-16-0. ポインタ


C++のポインタは簡単で楽しく習得できます。C++でのタスクにはポインタを使うことによってより簡単になるものがあり、別のタスクにおいても、動的なメモリ確保などはポインタは不可欠です。

これまで学んできたように、すべての変数はメモリ内に配置され、配置された場所はアドレスを持ちます。メモリ内のアドレスにアクセスするには&(アンパサンド)演算子を 使います。 次の例で変数の定義されたアドレスがどのように出力されるか考えてみます。
#include <iostream>

using namespace std;

int main ()
{
   int  var1;
   char var2[10];

   cout << "var1のアドレス: ";
   cout << &var1 << endl;

   cout << "var2のアドレス: ";
   cout << &var2 << endl;

   return 0;
}
上のコードをコンパイルし実行すると、次の結果が得られます。
var1のアドレス: 0xbfebd5c0
var2のアドレス: 0xbfebd5b6

ポインタとは何か?

ポインタとは変数とは別のアドレス値が入る変数です。他の変数や定数と同様に、使う前にポインタを宣言する必要があります。ポインタ変数の宣言は一般的に次の形になります。
型 *変数名;
ここでは、型はポインタの基となる型です。C++で有効な型でなければならず、変数名はポインタの変数名です。ポインタ宣言に使われるアスタリスク(*)は乗算に使うものと同じです。しかしながら、この構文においてはアスタリスクは変数をポインタとして指定するために使われています。 次の例は有効なポインタの宣言です。
int    *ip;    // 整数へのポインタ
double *dp;    // 実数へのポインタ
float  *fp;    // 浮動小数へのポインタ
char   *ch     // 文字へのポインタ
整数や文字列であってもポインタの値の実データ型は同じであり、メモリアドレスを示す16進数です。異なるデータ型のポインタ間の唯一に違いはポインタの示す変数または定数ののデータ型です。

C++でのポインタの利用

ポインタを頻繁に使う上で重要な操作があります。(a)ポインタ変数の定義、(b)ポインタ変数へのアドレスの代入、(c)有効なポインタ変数のアドレスにある値へのアクセスの3つです。これは*演算子を使うことによって、被演算子に指定された変数のアドレスにある値を返すことで行われます。 次の例でこれらの操作を見ていきます。
#include <iostream>

using namespace std;

int main ()
{
   int  var = 20;   // 変数の宣言
   int  *ip;        // ポインタ変数 

   ip = &var;       // varのアドレスをポインタ変数に保存

   cout << "var変数の値: ";
   cout << var << endl;

   // ポインタ変数ipの保存しているアドレスを出力
   cout << "ip変数のアドレス: ";
   cout << ip << endl;

   // ポインタの指すアドレスの値を出力
   cout << "*ip変数の指す値: ";
   cout << *ip << endl;

   return 0;
}
上のコードをコンパイルし実行すると、次の結果が得られます。
var変数の値: 20
ip変数のアドレス: 0xbfc601ac
*ip変数の指す値: 20

C++のポインタの詳細

ポインタは多くの、簡単な概念を持ち、C++プログラミングに取って重要です。次の表はC++プログラマにとって明快にしておくべき重要なポインタの概念です。
概念説明
nullポインタC++はnullポインタをサポートしており、複数の標準ライブラリで0の値の定数と定義されています
ポインタ演算ポインタの演算に利用できる4つの演算子++、--、+、-があります。
ポインタと配列ポインタと配列には密接な関係があります
ポインタの配列複数のポインタを保存する配列を定義できます
ポインタのポインタポインタへのポインタ
関数へのポインタ渡し参照またはアドレスを引数に渡すことで、呼ばれた先の関数で引数を変更することが可能になります
ポインタを返す関数関数はローカル変数、静的変数、動的に確保されたメモリを指すポインタ返すことができます
  • ?±??G???g???[?d????u?b?N?}?[?N???A

0 件のコメント :

コメントを投稿