単純なポインタとは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > 単純なポインタの意味・解説 

単純なポインタ

出典: フリー百科事典『ウィキペディア(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 /* argc : コマンドライン引数の数。argv : コマンドライン引数文字列群。ゼロ終端文字列先頭要素へのポインタ char* の配列があり、その先要素へのポインタであり、char *argv[] と宣言するともできる配列要素数は argc + 1 個。最後要素 argv[argc] は常に NULL となる(番兵)。https://ja.cppreference.com/w/cpp/language/main_function*/int main(int argc, char **argv) { while (*argv != NULL) printf("%s\n", *argv++);} ポインタ配列先頭要素へのポインタargvを操作してそれぞれの要素が指すゼロ終端文字列char*)を標準出力書き出している。しかし、間接演算子"*"とインクリメント演算子"++"のどちらの優先度が高いのかを知らないと、このような記述理解することはできない。したがって保守作業の際にバグ誘発しやすいため、以下のように記述したほうがよいとする主張もある。 while (*argv != NULL) { printf("%s\n", *argv); argv++;}

※この「単純なポインタ」の解説は、「ポインタ (プログラミング)」の解説の一部です。
「単純なポインタ」を含む「ポインタ (プログラミング)」の記事については、「ポインタ (プログラミング)」の概要を参照ください。

ウィキペディア小見出し辞書の「単純なポインタ」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「単純なポインタ」の関連用語

単純なポインタのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



単純なポインタのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaのポインタ (プログラミング) (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2024 GRAS Group, Inc.RSS