回答編集履歴
3
CのコードをC99以降でのより「望ましい」コードへと書き換えた。
test
CHANGED
@@ -5,33 +5,37 @@
|
|
5
5
|
```C
|
6
6
|
#include <stdio.h>
|
7
7
|
#include <stdlib.h>
|
8
|
+
#include <inttypes.h>
|
8
9
|
|
9
|
-
int main(void)
|
10
|
+
int main(void)
|
10
11
|
{
|
11
|
-
int a = 10;
|
12
|
+
int16_t a = 10;
|
12
|
-
int *p = &a;
|
13
|
+
int16_t *p = &a;
|
13
|
-
int *k = &a;
|
14
|
+
int16_t *k = &a;
|
14
|
-
printf("%d %d\n", *p, *k);
|
15
|
+
printf("%" PRId16 " %" PRId16 "\n", *p, *k); /* 10 10 */
|
15
16
|
return EXIT_SUCCESS;
|
16
17
|
}
|
18
|
+
```
|
17
19
|
|
18
|
-
```
|
19
20
|
と
|
21
|
+
|
20
22
|
```C
|
21
23
|
#include <stdio.h>
|
22
24
|
#include <stdlib.h>
|
25
|
+
#include <inttypes.h>
|
23
26
|
|
24
|
-
int main(void)
|
27
|
+
int main(void)
|
25
28
|
{
|
26
|
-
int a = 10;
|
29
|
+
int16_t a = 10;
|
27
|
-
int *p = NULL;
|
30
|
+
int16_t *p = NULL;
|
31
|
+
p = &a;
|
28
|
-
int *k = NULL;
|
32
|
+
int16_t *k = NULL;
|
29
|
-
|
33
|
+
k = &a;
|
30
|
-
|
31
|
-
printf("%d %d\n", *p, *k);
|
34
|
+
printf("%" PRId16 " %" PRId16 "\n", *p, *k); /* 10 10 */
|
32
35
|
return EXIT_SUCCESS;
|
33
36
|
}
|
34
37
|
```
|
38
|
+
|
35
39
|
は同じ結果になる、ってのは分かるかな。
|
36
40
|
まぁ当たり前だけどさ。
|
37
41
|
|
@@ -50,7 +54,7 @@
|
|
50
54
|
|
51
55
|
って事になる。
|
52
56
|
前者のアスタリスクは宣言時に「ポインタ型」を生成する為の機構、後者のアスタリスクを[**間接参照演算子**](https://daeudaeu.com/c-address-operand/)っつーんだ。
|
53
|
-
**Cの極悪仕様**は、全く違う機能に同じ記号(アスタリスク)を採用している事となり、混乱の元
|
57
|
+
**Cの極悪仕様**は、全く違う機能に同じ記号(アスタリスク)を採用している事となり、混乱の元となっている。
|
54
58
|
|
55
59
|
つまり、貴方のように(貴方が悪いわけじゃない)、
|
56
60
|
|
@@ -68,38 +72,41 @@
|
|
68
72
|
と言う意味なんだ。
|
69
73
|
|
70
74
|
なお、本当の事を言うと、僕はCは全然得意じゃないんだけど、細かい事を言う人は、与題のコードを次のように書くと思う。
|
75
|
+
|
71
76
|
```C
|
72
77
|
#include <stdio.h>
|
73
78
|
#include <stdlib.h>
|
79
|
+
#include <inttypes.h>
|
74
80
|
|
75
81
|
int main(void)
|
76
82
|
{
|
77
|
-
int a = 10;
|
83
|
+
int16_t a = 10;
|
78
|
-
int *p = &a;
|
84
|
+
int16_t *p = &a;
|
79
|
-
int *k = NULL;
|
85
|
+
int16_t *k = NULL; /* ポインタ変数宣言時は必ずNULLで初期化する */
|
80
86
|
k = &a;
|
81
|
-
printf("%d %d\n", *p, *k);
|
87
|
+
printf("%" PRId16 " %" PRId16 "\n", *p, *k); /* 10 10 */
|
82
88
|
return EXIT_SUCCESS;
|
83
89
|
}
|
90
|
+
```
|
84
91
|
|
85
|
-
```
|
86
|
-
多分、
|
92
|
+
多分、「ポインタ変数だけ」で宣言しない。必ず```NULL```**で初期化**する。
|
87
|
-
基本的にCはアセンブリ言語に毛が生えた程度の言語なんで、ポインタ変数の初期値が「何でも良い」的なコーディングは、バグの元なん
|
93
|
+
基本的にCはアセンブリ言語に毛が生えた程度の言語なんで、ポインタ変数の初期値が「何でも良い」的なコーディングは、バグの元なんで避けるんじゃないだろうか。
|
88
94
|
結果、Cプログラマはこっちの記述形式
|
89
95
|
|
90
96
|
```C
|
91
97
|
#include <stdio.h>
|
92
98
|
#include <stdlib.h>
|
99
|
+
#include <inttypes.h>
|
93
100
|
|
94
101
|
int main(void)
|
95
102
|
{
|
96
|
-
int a = 10;
|
103
|
+
int16_t a = 10;
|
97
|
-
int *p = &a;
|
104
|
+
int16_t *p = &a;
|
98
|
-
printf("%d\n", *p);
|
105
|
+
printf("%" PRId16 "\n", *p);
|
99
106
|
return EXIT_SUCCESS;
|
100
107
|
}
|
108
|
+
```
|
101
109
|
|
102
|
-
```
|
103
110
|
を好むんじゃなかろうか。一々宣言時に```NULL```で初期化しといて、改めて代入、ってのは面倒くさいからね。
|
104
111
|
ただ、貴方のように初心者で、「書き方を学んでいる」最中なら、どうしてもポインタ変数「だけ」を宣言する場合、```NULL```で初期化するクセは付けておいた方がいいと思う。
|
105
112
|
その方が意味は分かりやすくなるしね。
|
@@ -109,20 +116,21 @@
|
|
109
116
|
```C
|
110
117
|
#include <stdio.h>
|
111
118
|
#include <stdlib.h>
|
119
|
+
#include <inttypes.h>
|
112
120
|
|
113
121
|
int main(void)
|
114
122
|
{
|
115
|
-
int a = 10;
|
123
|
+
int16_t a = 10;
|
116
|
-
int* p = &a;
|
124
|
+
int16_t* p = &a; /* アスタリスクはintの方に付ける */
|
117
|
-
printf("%d\n", *p);
|
125
|
+
printf("%" PRId16 "\n", *p);
|
118
126
|
return EXIT_SUCCESS;
|
119
127
|
}
|
128
|
+
```
|
120
129
|
|
121
|
-
```
|
122
130
|
宣言時のデータ型の方にアスタリスクを付ける。「機能が違うんだから書き方も違うべき」って事だな。
|
123
|
-
|
131
|
+
もっとも、これもC言語のクソ仕様で(笑)、```int *p;```と言う宣言と```int* p;```と言う宣言の意味が全く同じ、ってのはヘンなんだけどね(笑)。
|
124
132
|
|
125
|
-
なお、本当はこういう説明はご法度なんだけど、敢えて「教育用言語」として設計されたPascal
|
133
|
+
なお、本当はこういう説明はご法度なんだけど、敢えて「教育用言語」として設計されたPascalを使うと、与題のようなコードはこう書く。
|
126
134
|
Pascalではポインタ絡みはキャレットを使う。
|
127
135
|
|
128
136
|
```Pascal
|
2
マークダウンを追加
test
CHANGED
@@ -83,7 +83,7 @@
|
|
83
83
|
}
|
84
84
|
|
85
85
|
```
|
86
|
-
多分、絶対「ポインタ変数だけ」で宣言しない。必ず
|
86
|
+
多分、絶対「ポインタ変数だけ」で宣言しない。必ず```NULL```**で初期化**する。
|
87
87
|
基本的にCはアセンブリ言語に毛が生えた程度の言語なんで、ポインタ変数の初期値が「何でも良い」的なコーディングは、バグの元なんて避けるんじゃないだろうか。
|
88
88
|
結果、Cプログラマはこっちの記述形式
|
89
89
|
|
@@ -100,8 +100,8 @@
|
|
100
100
|
}
|
101
101
|
|
102
102
|
```
|
103
|
-
を好むんじゃなかろうか。一々宣言時にNULLで初期化しといて、改めて代入、ってのは面倒くさいからね。
|
103
|
+
を好むんじゃなかろうか。一々宣言時に```NULL```で初期化しといて、改めて代入、ってのは面倒くさいからね。
|
104
|
-
ただ、貴方のように初心者で、「書き方を学んでいる」最中なら、どうしてもポインタ変数「だけ」を宣言する場合、NULLで初期化するクセは付けておいた方がいいと思う。
|
104
|
+
ただ、貴方のように初心者で、「書き方を学んでいる」最中なら、どうしてもポインタ変数「だけ」を宣言する場合、```NULL```で初期化するクセは付けておいた方がいいと思う。
|
105
105
|
その方が意味は分かりやすくなるしね。
|
106
106
|
|
107
107
|
あと、Cが得意で大好きな人とか、あるいは教科書だと圧倒的に与題のような「ポインタ変数宣言」の書き方をするんだけど、僕のようにCがあまり得意じゃない人間とか、あるいはC初心者には次のような書き方の方が向いてると思う。
|
@@ -120,7 +120,7 @@
|
|
120
120
|
|
121
121
|
```
|
122
122
|
宣言時のデータ型の方にアスタリスクを付ける。「機能が違うんだから書き方も違うべき」って事だな。
|
123
|
-
最も、これもC言語のクソ仕様で(笑)、int *p;と言う宣言とint* p;と言う宣言の意味が全く同じ、ってのはヘンなんだけどね(笑)。
|
123
|
+
最も、これもC言語のクソ仕様で(笑)、```int *p;```と言う宣言と```int* p;```と言う宣言の意味が全く同じ、ってのはヘンなんだけどね(笑)。
|
124
124
|
|
125
125
|
なお、本当はこういう説明はご法度なんだけど、敢えて「教育用言語」として設計されたPascalなんかだと、与題のようなコードはこう書く。
|
126
126
|
Pascalではポインタ絡みはキャレットを使う。
|
1
言語名を明示した。
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
当然、
|
4
4
|
|
5
|
-
```
|
5
|
+
```C
|
6
6
|
#include <stdio.h>
|
7
7
|
#include <stdlib.h>
|
8
8
|
|
@@ -17,7 +17,7 @@
|
|
17
17
|
|
18
18
|
```
|
19
19
|
と
|
20
|
-
```
|
20
|
+
```C
|
21
21
|
#include <stdio.h>
|
22
22
|
#include <stdlib.h>
|
23
23
|
|
@@ -68,7 +68,7 @@
|
|
68
68
|
と言う意味なんだ。
|
69
69
|
|
70
70
|
なお、本当の事を言うと、僕はCは全然得意じゃないんだけど、細かい事を言う人は、与題のコードを次のように書くと思う。
|
71
|
-
```
|
71
|
+
```C
|
72
72
|
#include <stdio.h>
|
73
73
|
#include <stdlib.h>
|
74
74
|
|
@@ -87,7 +87,7 @@
|
|
87
87
|
基本的にCはアセンブリ言語に毛が生えた程度の言語なんで、ポインタ変数の初期値が「何でも良い」的なコーディングは、バグの元なんて避けるんじゃないだろうか。
|
88
88
|
結果、Cプログラマはこっちの記述形式
|
89
89
|
|
90
|
-
```
|
90
|
+
```C
|
91
91
|
#include <stdio.h>
|
92
92
|
#include <stdlib.h>
|
93
93
|
|
@@ -106,7 +106,7 @@
|
|
106
106
|
|
107
107
|
あと、Cが得意で大好きな人とか、あるいは教科書だと圧倒的に与題のような「ポインタ変数宣言」の書き方をするんだけど、僕のようにCがあまり得意じゃない人間とか、あるいはC初心者には次のような書き方の方が向いてると思う。
|
108
108
|
|
109
|
-
```
|
109
|
+
```C
|
110
110
|
#include <stdio.h>
|
111
111
|
#include <stdlib.h>
|
112
112
|
|
@@ -125,7 +125,7 @@
|
|
125
125
|
なお、本当はこういう説明はご法度なんだけど、敢えて「教育用言語」として設計されたPascalなんかだと、与題のようなコードはこう書く。
|
126
126
|
Pascalではポインタ絡みはキャレットを使う。
|
127
127
|
|
128
|
-
```
|
128
|
+
```Pascal
|
129
129
|
program foo(input, output);
|
130
130
|
var
|
131
131
|
a : integer;
|