teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

他回答者様のコメント欄での"call by reference"に関するコメントを受け、注釈を追加

2020/05/05 01:55

投稿

dodox86
dodox86

スコア9416

answer CHANGED
@@ -18,4 +18,6 @@
18
18
  sscanf(buf, "%d", &num);
19
19
  ```
20
20
 
21
- 立場を変えて、`sscanf`と言う関数を質問者さん自身が実装することを考えてみてください。`sscanf`に渡されてくる変数が、値渡し(call by value)で渡されたものであると、関数内で変更することはできません。ここで、値を呼び出し側の`main`へ変更して返したい場合は、アドレス、つまりポインターで渡すことで(call by reference) `sscanf`関数の中から作用させることができます。これは文字列(`char`型の配列)であろうと、`int`型であろうと、すべて同じことが言えます。
21
+ 立場を変えて、`sscanf`と言う関数を質問者さん自身が実装することを考えてみてください。`sscanf`に渡されてくる変数が、値渡し(call by value)**※**」で渡されたものであると、関数内で変更することはできません。ここで、値を呼び出し側の`main`へ変更して返したい場合は、アドレス、つまりポインターで渡すことで(call by reference)**※**」`sscanf`関数の中から作用させることができます。これは文字列(`char`型の配列)であろうと、`int`型であろうと、すべて同じことが言えます。
22
+
23
+ **※**C言語において「call by value」、「call by reference」と言う用語を使うことは説明上の慣例である場合を除き、不適切である可能性があります。ご注意ください。

2

誤記修正

2020/05/05 01:55

投稿

dodox86
dodox86

スコア9416

answer CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  ```C
11
11
  char msg[256];
12
- sscanf(buf, "%s", &msg[0});
12
+ sscanf(buf, "%s", &msg[0]);
13
13
  ```
14
14
 
15
15
  したがって、`int`型の整数に`sscanf`で取り出した値を代入する際に記述するのと同様の意味になります。

1

コードを少し整形、記載内容を修正。

2020/05/04 11:40

投稿

dodox86
dodox86

スコア9416

answer CHANGED
@@ -2,20 +2,20 @@
2
2
 
3
3
  ```C
4
4
  char msg[256];
5
- sscanf(buf,"%s",msg);
5
+ sscanf(buf, "%s", msg);
6
6
  ```
7
7
 
8
8
  これは一見、`msg`と言う`char`型の配列に直接代入されているように見えますが、実はそうではなく、`char msg[256]`配列の先頭のアドレスを`sscanf`の引数として渡しています。以下のようにも書き換えられます。`&msg[0]`と書くのがプログラマーにとって冗長なので、多くの場合に`msg`と記述するだけの話なのです。
9
9
 
10
10
  ```C
11
11
  char msg[256];
12
- sscanf(buf,"%s",&msg[0});
12
+ sscanf(buf, "%s", &msg[0});
13
13
  ```
14
14
 
15
15
  したがって、`int`型の整数に`sscanf`で取り出した値を代入する際に記述するのと同様の意味になります。
16
16
  ```C
17
17
  int num;
18
- sscanf(buf,"%d", &num);
18
+ sscanf(buf, "%d", &num);
19
19
  ```
20
20
 
21
- ちょっと反対に考えて、`sscanf`と言う関数を質問者さんが実装するとしましょう。`sscanf`に渡されてくる変数が、値渡し(call by value)で渡されたものであると、関数内で変更することはできません。ここで、値を呼び出し側の`main`へ変更して返したい場合は、アドレス、つまりポインターで渡すことで(call by reference) `sscanf`関数の中から作用させることができます。これは文字列(`char`型の配列)であろうと、`int`型であろうと、すべて同じことが言えます。
21
+ 立場を変えて、`sscanf`と言う関数を質問者さん自身が実装するを考えてみてください。`sscanf`に渡されてくる変数が、値渡し(call by value)で渡されたものであると、関数内で変更することはできません。ここで、値を呼び出し側の`main`へ変更して返したい場合は、アドレス、つまりポインターで渡すことで(call by reference) `sscanf`関数の中から作用させることができます。これは文字列(`char`型の配列)であろうと、`int`型であろうと、すべて同じことが言えます。