

詳説Cポインタの中に

>
> voidへのポインタは他のポインタに等しくなることはありません。(voidポインタの振る舞いは、システムに依存します)。ただし、2つのvoidへのポインタがともにnullポインタであるとき、それらは等しいとみなされます。

という記述があったのですが、voidポインタが他のポインタと等しくならないとはどういう点において等しくないのでしょうか？


CC BY-SA 4.0
2018-12-15T09:32:45.213
51230
2019-03-07T05:19:40.747
29863
question
c ポインタ
voidポインタについて


**その１）誤記または、翻訳ミスと思われます。**

「voidへのポインタは、他のポインタと同じように使用できない。」ではないか？

[code]

    int func(void *a, int *b)
    {
       long i;
       int  j;
    
       i = *(long *)a;  // キャストが必要
       j = *b;          // キャストが不要
    ...
       return j;
    }
    
[/code]

※func()関数が第１引数であるvoid *型で渡される実体がlong型であることを知っている前提。

**その２）2つのvoid *型が全く同じアドレスを保持していた場合**

キャストすべき型が同じなら等しいポインタと言えるし、  
キャストすべき型が違うなら異なるポインタと言える。


CC BY-SA 4.0
2018-12-16T08:04:19.433
51252
2018-12-16T08:32:31.273
2018-12-16T08:32:31.273
3068
31474
51230
answer


荒井さんの回答のコメント・・・と思ったのですが・・・信用がない；；  
で、voidポインタは他のポインタ（char _など）と違って、_
(p+1)等の加減算が一切出来ません。これは、データ型が判らないのでいくら（何バイト）進めたらいいか分からないからです。


CC BY-SA 4.0
2019-03-07T03:59:10.903
53257
2019-03-07T03:59:10.903
25438
51230
answer


いまさらなんですが、  
オライリーの「詳説 Cポインタ(Understanding and Using C Pointers : Richard
Reese)」の英文に以下のような部分があります。  
カッコ内はGooglによる自動翻訳をプログラマ向けに少し手直ししたものです。

> /////引用(翻訳)開始
>
> Pointer to void (voidへのポインタ)
>
> A pointer to void is a general-purpose pointer used to hold references  
>  to any data type. An example of a pointer to void is shown below:  
>  (voidへのポインタは、あらゆるデータ型への参照を保持するために使用される汎用ポインタです。)  
>  (voidへのポインタの例を以下に示します。)
>
> void *pv;
>
> It has two interesting properties: (これらには、2つの興味深い特性があります。)
>
> ・ A pointer to void will have the same representation and memory alignment
> as a pointer to char.  
>  (・voidへのポインタは、charへのポインタと同じ表現とメモリアライメントを持ちます。)
>
> ・ A pointer to void will never be equal to another pointer. However, two
> void pointers assigned a NULL value will be equal.  
>  (★)(・voidへのポインタが他のポインタと同じになることはありません。ただし、NULL値が割り当てられた2つのvoidポインタは等しくなります。)  
>  /////以上で引用終了

(★)を付けた部分では確かに等しくならないという翻訳になってしまいます。  
ですが、それに続く内容では同じに扱える性質と同じに扱えない性質を説明しているため、  
もう少し注意深く意訳すべきだったかもしれません。例えば、

訳例1(voidへのポインタは、他のポインタと同じとみなしてはいけません。)  
訳例2(voidへのポインタは、他のポインタと同じ様に扱うことはできません。)

などでしょうか。この様な感じであれば誤解されづらいと言えます。


CC BY-SA 4.0
2019-03-07T05:19:40.747
53258
2019-03-07T05:19:40.747
3793
51230
answer