こんにちは。毎度お世話になります。少し抽象的な質問になってしまうかもしれませんが、ご容赦ください。
C++の特徴としてあげられるのが「ポインタ」の存在だと思いますが、勉強していていつこれを使えばよいのかいまいちピンときません。
動作が速くなる、という利点があるのは理解していますし、STLなどでもイテレータがポインタのようなふるまいをするのも知っています。しかし、実際にnewやdeleteで自分で確保、開放をおこなうイメージがあまりなく、「ポインタ」について自分はどこまで理解できているのか不安です。
実際のコード中でポインタを使うタイミングはどのようなときでしょうか?
No.6
- 回答日時:
抽象的な意味でのポインタ(オブジェクトへの参照)はオブジェクト指向言語にとって必須のものです。
ただガーベージコレクタのないポインタは本質的に安全でないのですけどね。C/C++のポインタは非常に原始的で、ガーベージコレクタどころか参照数管理もしてなく、メモリ管理を利用者任せにするオブジェクト指向言語としてはあまりうれしくないものです。一方で、例えばオブジェクト指向言語のメモリ管理を実装するといった低水準の実装にはこういう原始的な機能がないと困るのですけど。
ということで、ポインタを使うのはメモリ管理自体を作成したいときですね。
それ以外は基本スマートポインタを使いましょう。というか高水準アプリケーションならメモリ管理してくれない言語じゃなく、メモリ管理が言語仕様に含まれる言語を使う方が楽です。
メモリ管理自体を作成することはなかなかないものでしょうし...。基本はスマートポインタを使って(あるいは他の言語を使って)プログラミングすべし!ということですね。
回答、ありがとうございました。
No.5
- 回答日時:
ちょっと別の観点から言えば、多くの場合、(データ)メモリへのアクセスは、変数名を経由して行います。
だから、プログラミングの際に必要な変数がすべて宣言できれば、ポインタはなくてすませることができます。
(少し嘘が混じってますが)
逆に、「どのくらいの変数が必要か実行してみないとわからない」という場合があります。
単純にデータ量がわからないとか、入力されたデータを見ながら、データ構造を組み立てなければならないとか。
そういう場合、あらかじめ宣言した変数だけではアクセスできなくなるので、「動的に宣言した変数」という性格を持つ、ポインタの出番になります。
ユーザー定義型などがこれに当てはまり、ここでnewの出番!ということか...。
回答、分かりやすかったです。ありがとうございました。
No.4
- 回答日時:
「ポインタ」というものをどう解釈するかって問題はあって, 例えば C++ や Java の参照も「ポインタの亜種」といえなくはない. そしてそう考えると, (「ポインタ」というよりもその値である「アドレス」だけど)
オブジェクトのアイデンティティ
ともいえるのではないかな.
勉強になります。確かに参照も受け私の際は値自体を変えるものだし、亜種といえないこともないですね...。
回答、ありがとうございました。
No.1ベストアンサー
- 回答日時:
Stringの受け渡し、リストの受け渡し、様々なフィールドを持つオブジェクトの受け渡し、動的に確保した領域の受け渡し、受け渡した後で値の変更した時に追随してほしい場合といったあたりでしょうか。
特別にこうでなければならないという決まりはありませんが以下のように分類できます。
■ポインタでの受け渡いが必須の状況
・受け渡した後で値の変更した時に追随してほしい場合
■ポインタでの受け渡しが推量される状況
・様々なフィールドを持つオブジェクトの受け渡し
→これらは値を全コピーすると大変な負荷がかかります。
ただし、受け渡したデータを書き換えられても、呼び出し元でデータが変わっては困る場合は必要な部分だけ値渡しが推奨されます。。。
■ポインタでの受け渡しが状況によって推奨される状況
・リストの受け渡し
・動的に確保した領域の受け渡し
・Stringの受け渡し
→概ね128Bitを超える可能性がある場合はポインタでの受け渡しが推奨されます。
一方128Bit以下であることが保証される場合は、値渡ししても問題ありません。
■ポインタの受け渡しが推奨されない状況
int、short、long、double、flostなど概ね128Bit以下のデータ型の受け渡し
→ポインタ渡しはアドレス(64Bitまたは32Bit)を受け渡し、受け取った側はメモリアクセスして取得してきたアドレスに再度アクセスしなおすというオーバヘッドが発生します。
小さすぎるデータは値変更への追随が必須といった事情がなければポインタ渡しはすべきではありません。
それぞれ、場合に分けて下さり、とても分かりやすいです。
言われてみると、「値変更」などは実際に自分でも行っていたアドレスを使ったものですし、他のものも含め、無意識のうちにポインタという機能を使っていた気がします。
改めて分類していただくことで、頭の中が整理された気がします。回答、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# C言語 配列とポインタについて 2 2022/06/02 11:53
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# いまc言語を独学で勉強しているのですがいまいちわかりません。 https://monozukuri- 3 2023/07/06 18:59
- デスクトップパソコン 全画面表示でもタスクバーを前面に隠す、表示させるようにしたい 3 2022/03/23 12:30
- C言語・C++・C# C言語で構造体の参照渡しができません 2 2022/12/18 21:22
- その他(ブラウザ) Microsoft edgeのスクロールバーについて 2 2022/09/19 16:56
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- C言語・C++・C# 双方向リスト 1 2023/06/28 04:16
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、写真のプログラムをどう直せ 2 2022/07/09 21:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
C言語の関数と配列に関する質問
-
fopne で失敗する原因
-
メモリのアドレスからの値の取...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
エラーの意味
-
参照型で受け取った引数をポイ...
-
【VC++2005(CLR)】マルチスレッ...
-
TCHAR文字列内の検索について
-
セグメントエラー
-
ポインタのアドレス範囲
-
【なぜポインタを使うのか】
-
C言語のプログラムをJavaに...
-
ポインタ変数の利用方法
-
コンストラクタでnewを失敗した...
-
クイックソートの比較交換回数...
-
ポインタのミスでOS壊れるの...
-
デバイスハンドルとは?
-
#define NULL ((void *)0) の弊害
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
C言語の関数と配列に関する質問
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
main(int argc,char **argv[])...
-
アプリを32bitから64bit移行
-
ハンドルはポインタか
-
連結リスト 要素の入れ替え
-
C言語でのconstを返す関数
-
Cで作成したDLL関数をVBから呼...
-
NULLとブランクの違い
-
エラーの意味
-
ハンドル、アドレス、ポインタ...
-
DLL<->VB間での受け渡し(文字...
-
【C言語】戻り値が構造体の関数
おすすめ情報