ポインタを勉強していく中で、main関数では引数の値を単純に変化させただけでは、main関数の変数の値を変化させる事はできないという事は理解しました。(別の関数に入れる引数はコピーを渡すイメージですかね?)
という事は、ポインタは関数を十分に機能するためにあるものだという事ですか?
ポインタという機能が我々にもたらしている利益で
最も大きいものは何でしょうか
ご意見を聞かせてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
ポインタは、メモリに直接触れるものと考えると分かりやすいかもしれません。
最も大きいというのは人によって違うと思いますので、個人的にポインタの利用方法などを書いてみます。
質問内に関数の話が出てきているので、値渡しと参照渡しは理解されているかと思います。
参照は関数間でデータをやり取りするときだけでなく、なにか大きなデータを順次処理するような場合にも使えます。
最近の言語では、大抵配列やストリームで処理するかと思いますが、ポインタを使って参照渡しされた変数には、メモリ上のアドレスが代入されているわけですから、その変数に値を1足すと、一つ隣のデータが取り出せるわけです。
音声や画像や、特定の構造体を持ったデータを処理する場合に、ポインタの値を操作することで、好きな位置のデータが参照できるので、現在ポインタが指しているデータと、メモリ上で一つ前のデータ値を合わせて、本来の値を算出する、などが可能です。
他に、関数も変数と同じようにメモリ上へ配置されています。
変数に値のメモリアドレスが代入されているわけですから、関数のメモリアドレスも代入することができます。
これはコールバックなどに使うのですが、関数のアドレスが入っていることで、呼び出し元は、呼び出し先をあまり意識せずに扱うことが可能です。
メモリ管理などを自動でやってくれる言語がなかった頃だと、自分でメモリ内のデータ管理もしないといけなかったので、ポインタの概念が学習しやすかったかもしれませんが、実際に使いたい場面が出ないと、なかなか理解しにくいかと思います。
とにかくプログラムを書いてみて、困ったことが出てきたら解決法を調べてみるという方が、使い方が分かりやすいかもしれません。
投稿2015/09/03 07:04
退会済みユーザー
総合スコア0
0
一番のメリットかというと微妙ですが
メリット2点あげると
・関数に渡す際のコピーが少なくて済む
関数に対しては値をコピーして引数を渡しますが、
ポインタで渡すとたとえ数百MByteの構造体であっても
8Byte(64bit OSの場合/32bit OSなら4Byte)のコピーですみます。
・メモリの操作を抽象化できる
たとえばmemcpyのようにどのアドレスからどれだけの値をどこにコピーするといった処理を書くのに
コピーするデータがintなのかdoubleなのかといったことを関数は意識する必要がなくなります。
この辺も結構大きなメリットだと思います。
投稿2015/09/03 08:04
総合スコア985
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
私の理解では、ポインタとはメモリ上の値に規則性をもってアクセスする手法と考えています。
このポインタがないと配列や構造体のような効率的なメモリアクセスはできなくなると思います。
たとえば配列についてですが。
C
1int score[5]; 2score[0] = 10; 3score[1] = 20; 4score[2] = 30; 5score[3] = 40; 6score[4] = 50;
上記のような、配列があった場合、a[b]は*(a+b)のシンタックスシュガーです。
つまり上を書き換えると下記のようになります。
C
1int *(score + 5);//int型のメモリを5個取得し、ポインタ変数scoreに開始メモリを入れる。 2*(score + 0) = 10;//score+0*(int型に必要なメモリ量)のメモリに10を代入 3*(score + 1) = 20;//score+1*(int型に必要なメモリ量)のメモリに20を代入 4*(score + 2) = 30;//score+2*(int型に必要なメモリ量)のメモリに30を代入 5*(score + 3) = 40;//score+3*(int型に必要なメモリ量)のメモリに40を代入 6*(score + 4) = 50;//score+4*(int型に必要なメモリ量)のメモリに50を代入
今回は配列について説明しましたが、構造体や関数ポインタ、デバイスのポートなどなど大体同じ理屈です。
投稿2015/09/03 07:43
総合スコア18155
0
関数に渡した値は、仮引数といい、(コピーを渡します)
コピーなので、main()が持つ変数が実変数に変化はありません、全く別物扱いです
ポインタは、実変数の参照先(アドレス)を渡します。
名前にあるように *(ポインタ演算子) & (アドレス演算子)
と名前が付いてますね。
main()
{
int a;
func( &a );
}
func( int *p )
{
}
このように記述してると思いますが、 mainのaのアドレスをfunc( *p )ポインターで受け取り
この場合参照が渡ってるので、*p = 10; とすると p = &a なので
a = 10; となります。
言語仕様のはなしだと、
ポインタは関数内で他の関数の変数がいじれる事にメリットがあります。
関数ポインタを返せば、コールする関数も変わるといった
かなり重要なメリットもあります。
一番大きいのは、メモリに直アクセスが可能て事が最大のメリットですね。
投稿2015/09/04 05:34
総合スコア1021
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/03 07:16
退会済みユーザー
2015/09/03 07:35
2015/09/04 05:44