回答編集履歴

9

文言修正

2020/06/18 15:53

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- 気になったのでC++の仕様書を確認したら、
25
+ 気になったのでC++の仕様書(Draft)を確認したら、
26
26
 
27
27
  ポインタ同士の引き算は
28
28
 

8

文言修正

2020/06/18 15:53

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  ポインタ同士の引き算は
28
28
 
29
- - どちらもNULLなら結果は0
29
+ - どちらもヌルポインタと評価されるなら結果は0
30
30
 
31
31
  - どちらも同じ配列の要素を指しているならば要素番号の引き算結果
32
32
 

7

C++の仕様書確認結果を追記

2020/06/18 15:47

投稿

SHOMI
SHOMI

スコア4079

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

脱字修正

2020/06/18 15:45

投稿

SHOMI
SHOMI

スコア4079

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

文言修正

2020/06/18 05:16

投稿

SHOMI
SHOMI

スコア4079

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

文言修正

2020/06/18 02:32

投稿

SHOMI
SHOMI

スコア4079

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追記

2020/06/18 02:31

投稿

SHOMI
SHOMI

スコア4079

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

書式修正

2020/06/18 01:21

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  - `&a[n]` == `a + n`
8
8
 
9
- - `&a[0]` == `a` == `a + n` - `n` == `&a[n] - n`
9
+ - `&a[0]` == `a` == `a + n - n` == `&a[n] - n`
10
10
 
11
11
 
12
12
 

1

文言修正

2020/06/18 01:17

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -10,4 +10,4 @@
10
10
 
11
11
 
12
12
 
13
- 配列要素のポインタとしての加減算は`n`ですが、実アドレスの差は`sizeof(a[0]) * n`となります。
13
+ ポインタとしての加減算は`n`ですが、実アドレスの差は`sizeof(a[0]) * n`となります。