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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

748閲覧

関数とポインタについて

qwertyhghv

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/10/28 07:52

int 型の変数に格納されている値を 100 に変更しようとする2つの関数
void hundred1(int) と void hundred2(int*)を作成し、それぞれ動作を確認するプログラムを作成したいが、コンパイルできない。どうすればよいでしょうか。

(例)初期のa,bの値は任意
before : a = 200, b = 200
after : a = 200, b = 100

#include <stdio.h> void hundred1(int a){ return; } void hundred2(int* *b){ return; } int main(){ int a, b; a = 500; b = 500; printf("before : a = %d, b = %d\n", a, b); hundred1(a); hundred2(b); printf("after : a = %d, b = %d\n", a, b); return 0; }

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

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

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

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

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

jimbe

2021/10/28 08:00

ご質問のタイトルは内容が分かるように具体的に書いてください。 関数のパラメータの型が合っていないためでしょう。 値とポインタの違いをキチンと勉強して頂かないと完成しないように思います。
guest

回答1

0

ベストアンサー

コンパイルできない

というのはなにかエラーが出るのでしょうか?もしあればコピペしていただけると他のもっと詳しい回答者の方から回答がつくかと思います。


int型の変数に格納されている値を100に変更」する関数とのことですが、どちらの関数も引数の型が意図したものとは違うように思います。

hundred1(int a)は引数がint型なので値そのものがコピーして渡されますから、書き換えられたとしても関数を抜けるとその値は保存されないので意味がないでしょう。
以下のようなコードを書いて実行すると確認できます。

c

1#include <stdio.h> 2 3void hundred1(int i) { 4 i = 100; // 引数を書き換えてみるが…… 5 return; 6} 7 8int main() { 9 int a = 50; 10 11 printf("a = %d\n", a); 12 hundred1(a); 13 printf("a = %d\n", a); 14 15 return 0; 16}

hundred2(int** b)は逆にint型のポインタのポインタとなっているため、引数の中身(int型の値)にアクセスするには**bと2回 デリファレンス する必要があります。


ポインタについてまだ十分な理解ができていないのかなと愚推します。
その場合は以下を読んでいろいろとコードを書いて、しっかり理解しましょう。

【C言語】ポインタを初心者向けに分かりやすく解説 - だえうホームページ
「値渡し」と「参照渡し」の話 ポインタ渡しとは? - Qiita

c

1#include <stdio.h> 2 3void hundred(int* i) { 4 *i = 100; // ポインタが指し示す先の値を変更する 5 return; 6} 7 8int main() { 9 int a = 50; 10 printf("a = %d\n", a); 11 hundred(&a); // 変数を書き換えられるようにポインタを渡す 12 // hundred1(a); // これだと値をコピーして渡しているので書き換えられない 13 printf("a = %d\n", a); 14 return 0; 15}

コメントを参考に回答を改善しました。
みなさんありがとうございます。

投稿2021/10/28 08:14

編集2021/10/28 10:15
fj68

総合スコア752

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

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

qwertyhghv

2021/10/28 08:30

丁寧な解説をいただき、ありがとうございます。ポインタについて理解したいと思います。
dodox86

2021/10/28 08:30

参考に示されたQiitaの『「値渡し」と「参照渡し」の話 ポインタ渡しとは? - Qiita』記事ですが、 そのコメント欄を見ると分かりますが「値渡し」「参照渡し」についてやり取りされています。これはteratailでもたまに挙がる話題なのですが、(<コメント欄の投稿者もteratailの回答者の方が多くみられます)特に「参照渡し call by reference」という言葉はC言語には正確には当たらないので、注意が必要です。C言語の規格書にも値渡し(call by value)という言葉は出てきますが、参照渡し(call by reference)という言葉は出てきません。
fj68

2021/10/28 08:35

@dodox86 さん コメントありがとうございます。 そうなんですね、勉強不足で存じ上げませんでした。 勉強になります!
dodox86

2021/10/28 08:41

@fj68さん いえ、私もこのことについてはteratailで認識を新たにしたものでした。私がC言語を習ったはるか昔、確かにポインタについて「参照渡し」の言葉と共に教えてもらった記憶があります。プログラミング言語の進化に伴って使い分けが必要になったと少なくとも個人的に考えています。本質問については「ポインタについてしっかり学びましょう」という点で異議はありません。
fana

2021/10/28 08:58

> hundred1(int a)は引数がint型なので値そのものがコピーして渡されますから、書き換えられたとしても関数を抜けるとその値は保存されないので意味がないでしょう。 そのことを実際に確認できるコードを書け,っていう話なのではないでしょうか. > 変更しようとする という言い回しと,INとOUTの例を見るに.
fj68

2021/10/28 09:41 編集

@fana さん コメントありがとうございます。 そうですね、私もこういうことは実際に手を動かしてコードを書いて確認すべきだと思います。 qwertyhghvさんが手元で確認できるように、回答を修正してコードを追加してみました。
dodox86

2021/10/28 09:47

後出しの指摘ですみませんが: 提示のコード中ではvoid hundred2(int* *b) と引数がポインタへのポインタですが、最初の説明文ではvoid hundred2(int*)となっているので恐らくポインタへのポインタ版はそもそもtypoではないかと疑ったり。コンパイルエラーが起きていたのとポインタへの理解不足で質問者さん自身が気が付かなかっただけかと。変数に格納されている値の変更の可否は、通常のポインタで充分試せるはずだし、ポインタへのポインタは初心の方向けとは到底思えないので。
fj68

2021/10/28 10:14

@dodox86 さん あ、そうなのですか。「最初のコード」ということは途中で質問を編集したんですね。 なんにせよ私も「ちょっと初心者向けでないかもな」と懸念していたことでもあるので、ありがたいです。 ただ、後から質問を見た方にとっても有用な回答としたいので、コードは消しつつ、質問に合わせて言及はしておこうと思います。 ありがとうございます。
dodox86

2021/10/28 10:36

質問は編集はされていませんね。「最初の説明文」とは私の書き方が分かりづらく、悪かったですが、現時点の質問文、2行目で「void hundred1(int) と void hundred2(int*)を作成し」と記載されています。まぁ、fj68さんの現時点のご回答で至れり尽くせりな気がします。
fj68

2021/10/28 11:04

@dodox86 さん なるほど、私の方で勝手に勘違いしていました。 みなさんと作り上げた回答が多くの人の役に立つことを祈ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問