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

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

ただいまの
回答率

90.50%

  • C++

    3455questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 254

Hacchi_

score 4

void test(vector<int> *a){

    *a[0] = 10;

}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

エラーを取るだけなら

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

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

本来なら

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/03 15:39

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

    キャンセル

  • 2018/06/03 17:27

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

    キャンセル

  • 2018/06/03 17:43

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

    キャンセル

  • 2018/06/03 17:43

    @rtr1950x さん
    > 引数を変更する関数は全てポインタ渡しにしています(好みの問題ですが)

    私も以前は全く同じ方針でした。
    しかし、
    ・nullptrの存在を常に気にかけなくてはならないこと
    ・constを厳に付けるルールがあれば、シグネチャを見れば書き換えの有無が判断できること
    ・ポインタをやり取りする際には、&の有無という明確な目印がなくなってしまうこと
    ・スマートポインタがあるために、生のポインタを見るとその寿命がどうしても気になってしまうこと

    これらの理由から、参照渡しを常に使った方が良いのだと思うようになりました。

    ---
    けっきょく『どちらが正しい』ということは無いわけですが、コメントを頂いたことでより深く問題を考えられたように思います。
    コメントありがとうございます。

    キャンセル

  • 2018/06/03 17:49

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

    キャンセル

+2

こんにちは。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C++

    3455questions

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

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