質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

15674閲覧

Vector と ポインタ に関して

LN5

総合スコア10

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/08/15 15:25

編集2016/08/16 02:41

c++でポインタに入っている配列の先頭アドレスをvector に参照渡ししたいのですが、どなたか教えてください。(意味不明な所がありましたらコメントで返信します)
(追記)かいていたコードを下記に記載してました。これでは間違いでしょうか。

c++ コード char* data = ある参照したい配列の先頭アドレス vector <char> received; &received[0]=data;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

配列の先頭アドレスをvector に参照渡ししたい

一般にアドレス渡し=参照渡しですので普通にポインタを渡せば良いです。
もし、std::vector<>で参照を保持したいと言う意味でしたら、それは文法上できません。
また、配列を指すポインタを定義することはできますが、直ぐに先頭要素へのポインタに成り下がってしまいます(配列の要素数の情報が抜け落ちる)ので、ハンドリングは困難です。

従って、配列の先頭要素へのポインタをstd::vector<>で保持することをお勧めします。
例えばint型の配列なら、下記となります。

C++

1int a[10]={}; 2int b[20]={}; 3 4std::vector<int*> foo; 5foo.push_back(a); 6foo.push_back(b); 7// foo[0]は、&(a[0])と同じものです。 8// foo[1]は、&(b[0])と同じものです。

投稿2016/08/15 16:19

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LN5

2016/08/16 03:05

配列の先頭アドレスがわかったら、空のVectorに値を丸ごと投げる事はできないのかなと思ってたんですけど、それはできないのですね。回答ありがとうございます。
Chironian

2016/08/16 04:08 編集

C++の配列に入っている複数の値をstd::vector<>へ入れなおしたいということでしょうか? 配列の先頭アドレスだけでは要素数の情報が抜け落ちるので無理ですが、配列へのポインタのまま要素数情報が残っている状態ならできる可能性はあります。 追記されたソースでは、要素数の情報が抜け落ちてますので、配列に保持されている値全部をstd::vector<>へ静的な処理で入れなおすことはできません。 しかし、要素数が動的に判れば、push_back()をforループで回せば可能です。 char* data = ある参照したい配列の先頭アドレス; // char array[要素数];のような配列 std::size_t count = 要素数; vector <char> received; for (std::size_t i=0; i < count; ++i)   received.push_back(*data++);
LN5

2016/08/16 04:15

この場合の参照渡しだと要素数もわからないとだめなのですね。勉強になりました!ありがとうございます。
guest

0

ベストアンサー

(質問文が意味不明ですが勝手に意図を推測します。)

c++

1#include <cassert> 2#include <vector> 3 4int main() 5{ 6 int a[3] = {1, 2, 3}; 7 int* p = &a[0]; 8 std::vector<std::reference_wrapper<int*>> v = {p}; 9 10 assert(v[0].get() == &a[0]); // refer same object 11}

他回答へのコメントより引用:

配列の先頭アドレスがわかったら、空のVectorに値を丸ごと投げる事はできないのかなと思ってた

もしかして下記のような処理をしたかったのでしょうか?ただし、ここでは参照ではなく、配列の値をvectorにコピーしています。

#include <cassert> #include <vector> int main() { char a[] = "ABC"; char *p = &a[0]; std::vector<char> v(p, p+3); assert(v[0]=='A' && v[1]=='B' && v[2]=='C'); }

投稿2016/08/15 16:00

編集2016/08/16 03:49
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LN5

2016/08/16 03:17

今回もありがとうございます。このような関数があるとは知らなかったので助かりました。調べてみます。
LN5

2016/08/16 04:12

そういう感じです!でも、莫大なデータを扱おうとしていたので、なるべく簡潔にかきたくて、参照渡しだと、丸ごとコピーされるのでそれを行いたかったのです。
yohhoy

2016/08/16 06:28 編集

「参照渡しだとごとコピーされるので~」の意図が読み取れませんでしたが、C++言語の参照型(reference)は乱暴に言えば"初期化時にしか設定できないポインタ型のようなもの"です。データの実体を配列中においたままvectorはそこへの参照を保持したいという意味であれば、それは実現できません。(というより参照型のvectorは存在できません。最初のstd::reference_wrapperの例は、参照型に近い挙動をするラッパークラスを使ったエミュレーションです。) また参照にせよポインタにせよ、データ実体(どこかの配列?)を”指し示す”だけであり、その先に実体が存在することはプログラマが保証しなければなりません。このようなデータ実体とポインタ/参照の個別管理は困難を伴い、しばしば実体がすでに無効なのにポインタ/参照だけ残ってしまう"ダングリング・ポインタ/参照"というバグの温床になりがちです。プログラムの目的や構造にもよりますが、素直にvectorに値をコピーして保持することをお勧めします。
LN5

2016/08/16 08:29

まだポインタの事がわかってないみたいなのでポインタも勉強します。バクはやっかいですね、使うときは気をつけて使おうと思います。細かい説明ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問