2017-02-02 11 views
2

は基本的に私はconst修飾子を維持しながらC++でconstのポインタにポインタを置くことはできますか?

f(const void* a){ 
    // This is also what `(char**) a` would do behind the scenes 
    char** string_a_ptr {reinterpret_cast<char**>(const_cast<void*>(a))}; 

    // ... 

のようなものが可能であるかどうかを疑問に思って。

私の質問は、C++のC-Arraysに関する練習中に出てきました。 Cのために、私はconst void*引数を持つ関数ポインタを渡さなければなりませんでした。この場合、C-ストリングの配列を指していました。正しいタイプにキャストするために、私はコンスタンタンをキャストしなければなりませんでした。 C++で "(const char *)*"ポインタのようなものを得る方法はありますか?

私はconst char** '**のconst char型' と入力するタイプ 'のconstボイド*' から

reinterpret_castはを生み出す(const_castをせずに)出て試してみましたが、修飾子

(const*)*を離れてキャスト構文エラーが発生しました

'('トークン前にトークン

これは純粋に学問的な質問です。私は、std::string#include <algorithm>を使用して問題を簡単かつ安全に解決できることを認識しています。

私はそれに就いていますが、時々C++でC構造を使用する利点があるのでしょうか、あるいは可能なら避けるべきですか?私はC++でのCコードの小規模な運動の問題を抱えていましたが、かなりの頭痛の原因となり、私の人生でCコードをかなり書いていましたが、 または、extern C修飾子を使用し、Cコードを純粋なC言語で記述することをお勧めしますか?

+1

'const void *'は 'char * const *'になります。 ( 'const'修飾子を一貫して配置するともっと明らかです:' void const * '。) – Ryan

+0

私は理解しています。これを 'void const * 'として書き直すことは、まさに私の混乱を解決するものです。ありがとう! – maow

+1

"には、C++でC構造を使うことがあるという利点があります。しかし、あなたは常にそれらを避け、Cの構文が読みやすさ、型の正確さ、または保守容易性の点でどれくらいのコストを要しているかを知る必要があります。 'void * 'の場合は3つすべてが失われます。 – dascandy

答えて

4

これはchar* const *です。

のconstを置くために二重のポインタで3ヶ所あります。

const char** 

ポインタは、ポインタへの、あなたが変更することはできません文字に。

char *const * 

ポインタ、あなたが変更できないポインタへの文字へのポインタ。

char ** const 

ポインタあなたはポインタに変更することはできません。

これらを組み合わせて、さまざまな部分をconstにすることができます。

2

私は、これはあなたが探しているものであると信じて:

const char * const * string_a_ptr = static_cast<const char * const *>(a); 

[Live example]

したい(と、それは理にかなっている)場合でも最初constを落とすことができます。

説明:

const void * aconst何か(void)にaポイントということを意味します。したがって、aを別のポインタにキャストする場合は、constも指している必要があります。あなたの場合は、char*へのポインタにキャストしています。従って、char*constでなければなりません。定数ポインタ(ではなく、定数へのポインタである)を作成するための構文は、const*の右側に置きます。従って、char* const *

関連する問題