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

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

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

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

Q&A

解決済

2回答

442閲覧

引数で受け取った配列の中身を、ポインタを使って直接書き換えるにはどうしたら良いですか?

Hacchi_

総合スコア25

C++

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

0グッド

0クリップ

投稿2018/06/03 05:57

C++

1void test(vector<int> *a){ 2 3 *a[0] = 10; 4 5}

このように書こうとすると、
「このオペランドと一致する演算子”*”はありません」と言われてしまうのですが、
タイトルのようにするにはどうしたら良いのでしょうか?
引数で受け取った配列の中身を直接書き換えたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

エラーを取るだけなら

ポインタ外しを先にすれば良いです。

C++

1void test(vector<int> *a){ 2 (*a)[0] = 10; 3}

本来なら

ポインタではなく参照を使った方が良い場面かと思います。

C++

1void test(vector<int>& a){ 2 a[0] = 10; 3}

投稿2018/06/03 06:05

LouiS0616

総合スコア35660

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

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

Hacchi_

2018/06/03 06:39

なるほど、参照を使うべきなのですね!
rtr1950x

2018/06/03 08:27

参照渡しはメリット・デメリットがありまして、 ・test()の呼び出し元で、&演算子を書かなくて済むメリット。 ・test()の呼び出し元で、test()が引数を変更する可能性があるかどうか判断出来ないデメリット。 という点を考慮すべきかと思います。 ちなみに私は、引数を変更する関数は全てポインタ渡しにしています(好みの問題ですが)。
maisumakun

2018/06/03 08:43

「test()の呼び出し元で、test()が引数を変更する可能性があるかどうか判断出来ない」ですが、変更しないものであればconstな参照を取ればいいわけなので、「constでない参照を取る=書き換える可能性がある」と解釈してそう問題があるわけでもないかと思います。
LouiS0616

2018/06/03 08:43

@rtr1950x さん > 引数を変更する関数は全てポインタ渡しにしています(好みの問題ですが) 私も以前は全く同じ方針でした。 しかし、 ・nullptrの存在を常に気にかけなくてはならないこと ・constを厳に付けるルールがあれば、シグネチャを見れば書き換えの有無が判断できること ・ポインタをやり取りする際には、&の有無という明確な目印がなくなってしまうこと ・スマートポインタがあるために、生のポインタを見るとその寿命がどうしても気になってしまうこと これらの理由から、参照渡しを常に使った方が良いのだと思うようになりました。 --- けっきょく『どちらが正しい』ということは無いわけですが、コメントを頂いたことでより深く問題を考えられたように思います。 コメントありがとうございます。
rtr1950x

2018/06/03 08:49

@maisumakun さん >「constでない参照を取る=書き換える可能性がある」と解釈してそう問題があるわけでもないかと思います。 それは関数のシグネチャを確認する必要が有りますよね。 例えば「test( intVector );」というコードだけを見て判断できないので、私はポインタで渡す方針でいます。 処理の流れをザッと眺める時に、ポインタ渡しの方が簡単に判断できるので、私はそっちのが好みです。 (正しい・間違っているという議論ではなく、単に私の好みの主張ですが。)
guest

0

こんにちは。

演算子の優先順位の問題です。
*[]では[]の方が優先順位が高いので、*(a[0])と解釈されています。
(*a)[0]=10;でいけると思います。

投稿2018/06/03 06:05

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問