ここから本文です

C言語の配列について 配列とポインタを使った配列の違いがいまいち、分かりませ...

kai********さん

2020/5/2809:07:18

C言語の配列について

配列とポインタを使った配列の違いがいまいち、分かりません。

メリットとデメリットがあるのなら教えてください。

私なりには、ポインタの代表的なswap関数みた

いに配列の中身の値が変更出来るか出来ないかの違いと認識してるのですが合っていますか?

宜しくお願いします。

閲覧数:
35
回答数:
6

違反報告

回答

1〜5件/6件中

並び替え:回答日時の
新しい順
|古い順

2020/6/401:04:23

ポインタを使った配列というものが
mallocなどを使って用意した配列のことを
指しているのなら、それは配列で用意した
領域の先頭アドレスをポインタに入れているだけです。

ポインタは、64bitPCにおいて、long型と同じ
8バイトの同じ領域を持つ型の1種です。

配列は、メモリ上で連続したデータ構造のことを言います。

れてさん

2020/6/109:38:12

メリットは関数などに大きなサイズの配列を渡す時に現れます。
関数の引数に対し配列自体を渡すと関数内ではその配列すべての値のみをコピーしそれらを加工します。実際には配列内の値を加工してません。
ですが、ポインタを渡すという事はその変数自体(アドレス)を渡して加工させるということなのです。だから、ポインタを引数にして渡す際は&を付けるのです。ポインタ配列では配列の先頭だけを渡せば処理できます。つまりは、配列を渡す場合は配列全てを渡さなければいけないがポインタなら配列の先頭だけ渡せば処理ができる。これがメリットです。だから、大きなサイズのものを渡すとなると処理速度が大幅に変わります。

そして、これがswap関数においてポインタを渡す理由になるのです。
デメリットは、扱い方が難しいとかでは?

yuk********さん

2020/5/2818:57:32

メリットもデメリットもないです。
両者は「領域をどこに確保するか?」という点で使い分けます。
スタック上に確保するなら、前者を選択しコンパイラに領域の確保を任せます。ヒープメモリから確保するなら後者を選択し、自分で領域を確保します。

たしかに後者なら要素を収納するアドレスを後で変更できるので、アドレスを交換することで要素の入れ替えを高速に行える、という見解は正しいです。例えば、ソート対象のデータを収納するような場合は後者が向いているでしょう。
が、そもそもそのような場合は必然的に後者を選択することになります。スタックオーバーフローが怖いので。

2020/5/2813:20:31

配列は、ある単位となる要素がいくつも(密に)並んだデータ型です。
ポインタは、どこかにあるデータを指しているデータです。
全然同じじゃありませんね。

ただし、配列はデータが並んでいるものなので、そのうちの1つの所在がわかればそこから隣、さらに隣...と順次手繰ってアクセスすることが出来ます。なので、Cでは、配列を扱う仕組みとしてポインタを利用することにしています。

以下がCの規則で決まっています。

・配列が単独で記述されたら、それは配列の先頭要素へのポインタと解釈するという規則にした。

・ポインタpと整数Nがあるとき、
p[N]と*(p+N)は
等価とする

・関数の引数リストに配列を記述した場合、ポインタとして扱われる

このように、配列とポインタは密接な関係を持っていますが、決して同じものではありませんし、ポインタは配列のアクセスのためだけにあるのではありません。
そもそも「メリットとデメリット」などという議論が成り立つ関係ではありません。

mu54491102さん

2020/5/2810:58:49

配列とポインタは似ていますが全く同じではありません。
配列名は配列の先頭アドレスを表しますが
例えば

char str[] = "pointer is easy";

としたときstrは文字列の先頭アドレスを表しますよね?
でもポインタのように

str++;

のようなことができません。

ここが配列とポインタの違いです。

あとはほとんどポインタと配列はおんなじです。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる