単純なポインタ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/04/07 19:18 UTC 版)
「ポインタ (プログラミング)」の記事における「単純なポインタ」の解説
宣言例 int n;/* int型へのポインタである、ポインタ型変数 ptr を宣言 */int *ptr;/* int型変数 n へのポインタを代入 */ptr = &n; 何も指していないポインタ(ヌルポインタ) C言語の処理系では通例、無効なポインタを示す値として下記のようなNULLマクロが定義されている。 #define NULL ((void*)0) C言語では、voidへのポインタは任意の型へのポインタに自由に代入することができる。ポインタに無効値を代入する場合、通例このNULLマクロを使う。 int *ptr = NULL; 一方、C++では、NULLは整数定数のゼロに等しい。 #define NULL 0 そのため、C++では下記のように書くこともできる。 int *ptr = 0; C++ではNULLが整数定数のゼロに等しいことから起こる関数オーバーロードのルックアップに関する問題を解決するため、C++11以降では、std::nullptr_t型として評価されるキーワードnullptrが定義された。C++11以降でもNULLは引き続き利用可能だが、整数定数のゼロに等しいとは限らず、実装は処理系依存となる。 int *ptr = nullptr; 利用例 下記はポインタptrの参照先である変数nに整数値10を代入することになる。 int n = 0;int *ptr = &n;*ptr = 10;printf("%d\n", n); /* 10 */ 配列とポインタ C言語における配列(固定長配列)とポインタはそれぞれ異なるデータ型であるが、配列の添え字演算子は、ポインタの加減算とデリファレンスの糖衣構文である。 double a[10];int i;for (i = 0; i < 10; ++i) { const double x = i * 0.1; /* 以下はともに同じ意味を持つ。 */#if 1 a[i] = x; printf("%f\n", a[i]);#else *(a + i) = x; printf("%f\n", *(a + i));#endif} 実行時に要素数の決まる配列を作成する際など、動的にメモリ領域を確保するときは結果をポインタで受け取る。確保したメモリを解放するときもポインタを利用する。メモリ解放直後のポインタは無効な領域を指しており、これを「ダングリングポインタ」(dangling pointer) と呼ぶ。ダングリングポインタが指している領域を誤って使用することのないように、セキュリティ対策として明示的にNULLを代入しておく手法が推奨されている。 int i;int *ptr = malloc(sizeof(int) * 10);for (i = 0; i < 10; ++i) { ptr[i] = i;}free(ptr); /* 解放により ptr はダングリングポインタとなる。 */ptr = NULL; 関数の引数 C言語の関数は前述のように参照渡しをサポートせず、値渡しのみをサポートするため、出力は戻り値(返り値)による1つのみを持つことしかできないが、ポインタを利用することで疑似的に複数の出力を持つ関数を定義することが可能となる。 /* xはdouble型配列へのポインタであり、const double *xと宣言することもできる。 */double func(const double x[], int num, double *minVal, double *maxVal) { int i; double sum=0.0; assert(num> 0); *minVal = +DBL_MAX; *maxVal = -DBL_MAX; for (i = 0; i < num; ++i) { *minVal = MIN(x[i], *minVal); *maxVal = MAX(x[i], *maxVal); sum += x[i]; } return sum;}/* 関数の呼び出し例。 */double x[] = { 3, 19, 1, -3, -8, 0, 4 };double minVal, maxVal, sum;sum = func(x, 7, &minVal, &maxVal); 下記は標準入力を整数値に変換し、scanf関数の第2引数の参照先であるnにその整数値を出力する例である。scanf関数は書式文字列に応じて、可変長引数に渡された実引数の型が何であるかを判断する。例えば%d書式はintへのポインタが渡されたとみなす。 int n;int *ptr = &n;scanf("%d", ptr); または int n;scanf("%d", &n); ポインタへのポインタ 「ポインタへのポインタ」(多重間接参照、ダブルポインタ)を定義することも可能である。動的に確保したメモリへのポインタを関数引数で返却するときや、ポインタ配列を扱うときなどに利用される。 int *ptr;int **pptr;pptr = &ptr; ポインタ配列の例 #include
※この「単純なポインタ」の解説は、「ポインタ (プログラミング)」の解説の一部です。
「単純なポインタ」を含む「ポインタ (プログラミング)」の記事については、「ポインタ (プログラミング)」の概要を参照ください。
- 単純なポインタのページへのリンク