回答編集履歴
9
文言修正
test
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
|
23
23
|
|
24
24
|
|
25
|
-
気になったのでC++の仕様書を確認したら、
|
25
|
+
気になったのでC++の仕様書(Draft)を確認したら、
|
26
26
|
|
27
27
|
ポインタ同士の引き算は
|
28
28
|
|
8
文言修正
test
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
|
27
27
|
ポインタ同士の引き算は
|
28
28
|
|
29
|
-
- どちらも
|
29
|
+
- どちらもヌルポインタと評価されるなら結果は0
|
30
30
|
|
31
31
|
- どちらも同じ配列の要素を指しているならば要素番号の引き算結果
|
32
32
|
|
7
C++の仕様書確認結果を追記
test
CHANGED
@@ -15,3 +15,35 @@
|
|
15
15
|
|
16
16
|
|
17
17
|
質問の場合は`uintptr_t*`なので`sizeof(unsigned int) * 3` = `0xC`
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
---
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
気になったのでC++の仕様書を確認したら、
|
26
|
+
|
27
|
+
ポインタ同士の引き算は
|
28
|
+
|
29
|
+
- どちらもNULLなら結果は0
|
30
|
+
|
31
|
+
- どちらも同じ配列の要素を指しているならば要素番号の引き算結果
|
32
|
+
|
33
|
+
- それ以外は未定義
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
とあるので、異なるオブジェクトを指すポインタの引き算は未定義の動作ですね。
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
[Additive operators](https://timsong-cpp.github.io/cppwp/expr.add#5)
|
42
|
+
|
43
|
+
When two pointer expressions P and Q are subtracted, the type of the result is an implementation-defined signed integral type; this type shall be the same type that is defined as std::ptrdiff_t in the <cstddef> header ([support.types.layout]).
|
44
|
+
|
45
|
+
(5.1)If P and Q both evaluate to null pointer values, the result is 0.
|
46
|
+
|
47
|
+
(5.2)Otherwise, if P and Q point to, respectively, array elements i and j of the same array object x, the expression P - Q has the value i − j.
|
48
|
+
|
49
|
+
(5.3)Otherwise, the behavior is undefined. [ Note: If the value i − j is not in the range of representable values of type std::ptrdiff_t, the behavior is undefined. — end note ]
|
6
脱字修正
test
CHANGED
@@ -14,4 +14,4 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
-
質問の場合は`uintptr_t`なので`sizeof(unsigned int) * 3` = `0xC`
|
17
|
+
質問の場合は`uintptr_t*`なので`sizeof(unsigned int) * 3` = `0xC`
|
5
文言修正
test
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
|
13
|
-
ポインタとしての加減算は`n`ですが、実アドレスの差は`n`要素分の`sizeof(a[0]) * n`となります。
|
13
|
+
要素の型のポインタとしての加減算は`n`ですが、実アドレスの差は`n`要素分の`sizeof(a[0]) * n`となります。
|
14
14
|
|
15
15
|
|
16
16
|
|
4
文言修正
test
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
|
13
|
-
ポインタとしての加減算は`n`ですが、実アドレスの差は`sizeof(a[0]) * n`となります。
|
13
|
+
ポインタとしての加減算は`n`ですが、実アドレスの差は`n`要素分の`sizeof(a[0]) * n`となります。
|
14
14
|
|
15
15
|
|
16
16
|
|
3
uintptr_t追記
test
CHANGED
@@ -11,3 +11,7 @@
|
|
11
11
|
|
12
12
|
|
13
13
|
ポインタとしての加減算は`n`ですが、実アドレスの差は`sizeof(a[0]) * n`となります。
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
質問の場合は`uintptr_t`なので`sizeof(unsigned int) * 3` = `0xC`
|
2
書式修正
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
- `&a[n]` == `a + n`
|
8
8
|
|
9
|
-
- `&a[0]` == `a` == `a + n
|
9
|
+
- `&a[0]` == `a` == `a + n - n` == `&a[n] - n`
|
10
10
|
|
11
11
|
|
12
12
|
|
1
文言修正
test
CHANGED
@@ -10,4 +10,4 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
|
13
|
-
|
13
|
+
ポインタとしての加減算は`n`ですが、実アドレスの差は`sizeof(a[0]) * n`となります。
|