回答編集履歴

2

追記

2019/11/16 08:30

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -1,3 +1,105 @@
1
+ ※回答が物凄く分かりづらかったので全改修しました。
2
+
3
+
4
+
5
+ ---
6
+
7
+ 変数を渡したとき、値は別の領域にコピーされます。
8
+
9
+ ```C
10
+
11
+ #include <stdio.h>
12
+
13
+
14
+
15
+ void func(int x) {
16
+
17
+ printf("x is %d, at %p.\n", x, &x); // x is 42, at 0x7ffcbc66937c.
18
+
19
+ }
20
+
21
+
22
+
23
+ int main(void) {
24
+
25
+ int a = 42;
26
+
27
+ printf("a is %d, at %p.\n", a, &a); // a is 42, at 0x7ffcbc66939c.
28
+
29
+
30
+
31
+ func(a);
32
+
33
+
34
+
35
+ return 0;
36
+
37
+ }
38
+
39
+ ```
40
+
41
+
42
+
43
+ [Wandbox](https://wandbox.org/permlink/QZ2wByXBUiqYqWFh) (実行結果は毎回変わり得ます。)
44
+
45
+
46
+
47
+ 値がコピーされていても、領域が別に存在していることが分かります。
48
+
49
+ ですので、関数内でxの値をいくら書き換えてもaには影響しません。
50
+
51
+
52
+
53
+ ---
54
+
55
+ 一方グローバル変数を用いている例では、sumのコピーは発生しません。
56
+
57
+ ```C
58
+
59
+ #include <stdio.h>
60
+
61
+
62
+
63
+ int sum = 0;
64
+
65
+
66
+
67
+ void func(void) {
68
+
69
+ printf("sum(in func) is %d, at %p.\n", sum, &sum); // sum(in func) is 0, at 0x600974.
70
+
71
+ }
72
+
73
+
74
+
75
+ int main(void) {
76
+
77
+ printf("sum(in main) is %d, at %p.\n", sum, &sum); // sum(in main) is 0, at 0x600974.
78
+
79
+ func();
80
+
81
+
82
+
83
+ return 0;
84
+
85
+ }
86
+
87
+ ```
88
+
89
+
90
+
91
+ [Wandbox](https://wandbox.org/permlink/TfqjkWGt4pL9wlNB)
92
+
93
+
94
+
95
+ main関数からもfunc関数からも、同じ変数sumを参照していることが分かります。
96
+
97
+
98
+
99
+ 旧回答
100
+
101
+ ---
102
+
1
103
  C言語は実引数を値渡しするので、関数内で新たな値を代入しても外部には全く影響しません。
2
104
 
3
105
  変数のポインタを渡すようにすることで、関数内で変数の値を書き換えることができます。

1

追記

2019/11/16 08:30

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -9,3 +9,9 @@
9
9
 
10
10
 
11
11
  返り値と言う形で結果を受け取り、main関数内で変数を書き換えているからです。
12
+
13
+
14
+
15
+ なお、確かにsumはグローバル変数ですが、
16
+
17
+ これは『all_pointの値を更新できること』自体には関係ありません。