No.5ベストアンサー
- 回答日時:
#4 訂正
>ネストを似やすくするため全角スペースを入力しています
ネストを見やすくするため全角スペースを入力しています
どうせなので
多分間違いだとは思いますが#3さんのは
>change(a, a, 2);
change(a, 1, 2); の打ち間違いだと思われます
更に思いつき#1さんのをちょっと書き方変えてみました
>void change(int a[],int i,int n){
>a[i]=n;
>}
コール側
change(a, 1, 2); //a[1] に2を代入する
関数側
void change(int *addr, int pt, int newdata){
*(addr+pt) = newdata;
}
もありかな(同じくコンパイルなどはしてません)
この回答への補足
配列の添字はポインタで置き換えが利いてさらに応用的な定義の仕方があるということですね。
今の段階ではまだよくわかりませんが、もう少しポインタが分かるようになったら、再度この関数が
理解できるようになるかもしれません。
C言語の参考書にもポインタと配列は密接な関係があるということですので、C言語を覚えるうえでは押さえておきたい重要な項目のようですね。
No.6
- 回答日時:
>配列にポインタを使うメリットというのはどういうところなのでしょうか。
ポインタは配列限定で使うものではありません
(確かに配列イメージが多いのは間違いはありませんし始めは其処からいったほうがわかりやすいです)
例えば構造体のアドレスを求めるなどのこともできます
(ポインタとはアドレスを指し示している変数と考えてください)
(考え方なので人それぞれですが)私が思うメリットとしては
・延々と配列で操作をするよりソースコードの文字的に少なくなる
(↑かなり強引なメリット)
・一般的に配列でアクセスするよりポインタアクセスしたほうが
実行速度が速い(アセンブリコードなどを見比べると分かりやすい)
・関数の引数に構造体のポインタを渡すことなどで大量のデータの引渡しができる
デメリットとしては
・慣れるまで難しい
・操作を間違えるとほぼ間違いなく他のメモリを破壊する
ぐらいが思いつきます
この回答への補足
ポインタというのは玄人好みの機能といえそうですね。
ほかのメモリを破壊するというのは、暴走してしまうというイメージでしょうか。
自分の作成したプログラムの範囲内でのメモリの破壊であればそれほどダメージはなさそうですが、
もしその他のアプリケーションなどに影響が出るのであれば素人には少しハードルが高めの機能ですね。
慣れるまで難しいということなので、理解できなくてもそれほどショックを受けなくてもよいということですね。
アドレスを指す変数ということでが、本日の配列の話に出てきたソースコードを見る限り、配列で使う限りは直接のアドレスを指定するのではないようなので、本日のソースコードの具体例をいじって使ってみてちょっとずつ覚えていくしかないようですね。
No.4
- 回答日時:
>ところで関数側にint dummyというのがありますが、
>コピペしてみてビルドしてみると、dummyが定義されてないとかでエラーになっちゃって。
ネストを似やすくするため全角スペースを入力しています
その為エラーになっていることが考えられます
(他にも変換ミスで全角が残っているかもしれません)
そうでない場合
>int dummy = *addr1;
の書き方をBCCが認識してないかもしれません
この行を以下の2行に書き換えてみてください
int dummy;
dummy=*addr1;
コンパイルしたコートを転記ではなく直接入力してますので
其処は御勘弁を
この回答への補足
確かにスペースとカンマを半角にしたら無事実行できました。
初歩的なことを聞いてしまい申し訳ありません。
ところで、配列にポインタを使うメリットというのはどういうところなのでしょうか。
C言語を理解する上では重要なところではあるようですが、初心者にはポインタの意義がいまいちわからなかったりしてしまいます。
No.2
- 回答日時:
#1さんと同じで質問の趣旨がよく分かりませんし
それだけを関数化してもあまりメリットないような気はしますが
(逆にオーバヘッドで速度低下する気がしないでもない)
そんなに多数の方法(書き方)があるわけではない思いますが
#1さんが書いた2手法と違う書き方で書けば(関数名はパクって同じ名前にします)
コール側
change(&a[3],30); //a[3]に30を代入する
関数側
void change(int *addr, int newdata){
*addr = newdata;
}
もしどこかの配列の中身(要素)を入れ替えたいのであれば
(こっちはたまに関数にしたりしてます)
コール側
swap(&a[3],&a[5]); //a[3]とa[5]のデータを入れ替える
関数側
void swap(int *addr1, int *addr2){
int dummy = *addr1;
*addr1 = *addr2;
*addr2 = dummy;
}
こんなとこかなと思いますが
この回答への補足
とりあえず配列が10までというのはたとえで、
60くらいの数値を入れ替えたり書き換えたりといった感じで
添字も関数で計算で値を出したりしてるので、すっきりとしたソースにしたいと思って
関数を何個か使ってみようと思っています。
関数を使わずに力技でソースを書くと書き間違いや同じような内容の繰り返しでごちゃごちゃしてしまいそうなのも心配です。
詳しい方がすぐに質問に答えてくださるので、質問する初心者としては非常に密度の濃い情報だと思います。
ところで関数側にint dummyというのがありますが、
コピペしてみてビルドしてみると、dummyが定義されてないとかでエラーになっちゃって。
ポインタとかもよくわかっていないレベルなので、もしお時間がありましたらそこも説明していただけると嬉しいです。
No.1
- 回答日時:
普通に a[9]=0;とか書き換える以外の方法ということですか?
何を聞きたいのかがいまいちピンときません・・・
それとも配列を参照として関数に渡す方法ということですか?普通にわたると思いますが?
配列は普通に渡せば参照渡しになりますので。
void change(int a[],int i,int n){
a[i]=n;
}
こんな感じとか。
この回答への補足
確かにあいまいな質問なのですが、回答は的確なようで、恐れ入ります。
ところで、
関数を呼び出す際に
change(a[],1,2);
とすると、 「構文エラー : ']'」というエラーが出てしまいますが、
定義した関数を呼び出す際は、この方法ではいかんのでしょうか?
なにぶん初心者なので、基本的すぎる質問かもしれませんが、
可能であれば答えていただければと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- JavaScript Javascript の配列の削除 (初心者) 4 2022/05/02 11:12
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- フリーソフト フォルダ、ファイル名の一括変換について 3 2023/03/16 09:23
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
C言語の課題が出たのですが自力...
-
c言語
-
コンボボックスでデフォルト値...
-
C言語において、 配列要素をひ...
-
100の階乗のプログラムって
-
配列の要素数に変数を入れたい...
-
C言語 プログラミング 関数につ...
-
C言語についてです 5人のテスト...
-
C言語 ファイルの指定された行...
-
配列のアドレス部
-
int i, int i[1];
-
c言語プログラミング 等差数列...
-
2番目の最大値を求める
-
C#で構造体の配列を持った構造...
-
C言語 構造体でつまずいています
-
要素数・要素の値が未定の配列...
-
define で 配列
-
c言語 構造体
-
C言語の配列のコピーについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
構造体のextern方法
-
C言語において、 配列要素をひ...
-
C#でのフィボナッチ数列
-
C言語の2次元配列 容量が大き...
-
C#で配列が空かを判定するには?
-
配列のアドレス部
-
char型配列をint型に代入するには
-
2番目の最大値を求める
-
C言語の課題が出たのですが自力...
-
C言語についてです 5人のテスト...
-
C言語から質問です。
-
C言語 ファイルの指定された行...
-
c言語 構造体
-
コンボボックスでデフォルト値...
-
MFCのCArrayを使った二次元配列
おすすめ情報