2017-11-20 12 views
-2

は、次のコードスニペットを考えてみましょう。ポインタへのポインタと等しいポインタへのポインタ。ありえない?

#include <iostream> 
using namespace std; 

int main() 
{ 
    char *sr[] = {"manipuri","konkani","punjabi","hindi","telugu","maithili","odia"}; 
    char **pt[] = {sr+2,sr+4,sr+3,sr+1,sr+6}, ***r; 
    r = pt; 
    for(int i=0;i<4;i++) ++r; 
    cout << **r+3; 
    return 0; 
} 

は、私はそれを理解する方法です。 'sr'は文字配列へのポインタです。その値は "マニュリ"の "m"のアドレスです。 'pt'は、文字配列のポインタへのポインタの配列です。値は他のポインタへのアドレスの配列です。 'r'は、文字のポインタへのポインタへの単一のポインタです。

'pt'を 'r'にどのように割り当てることが可能ですか?これらは完全に異なるデータ型です。 1つの場合、 'r'は、1文字のポインタを指すポインタを指すポインタを指します。一方、ptは、ARRAYの文字を指すポインタを指すARRAYです。

これはどのように可能ですか?

+0

http://wiki.c2.com/?ThreeStarProgrammer –

+0

'for(int i = 0; i <4; i ++){++ r;}を書くことを意味しましたか? cout << ** r + 3; } '? – user0042

+0

ポインタと配列は異なる型ですが、配列は配列の先頭へのポインタに簡単に減衰します。 'pt'を' r'に代入すると 'pt'の最初の要素(' char *** 'になる)を' r'に代入します。 –

答えて

1

ここでわかります。 'sr'は文字配列へのポインタです。

srはポインタではありません。それはポインタの配列です。

この値は、「マニュリ」の「m」のアドレスです。

概念的には、配列の値はすべて配列の要素です。ただし、値のコンテキストで使用すると、配列は最初の要素へのポインタに減衰します。ポインタの値はメモリアドレスです。

'pt'を 'r'にどのように割り当てることが可能ですか?これらは完全に異なるデータ型です。

srと同様に、ptも最初の要素へのポインタになります。 ptの要素は、タイプ**charです。したがって、ptの要素へのポインタは***charです。タイプはrです。

できません。

はいT*のオブジェクトには、タイプT[n]のオブジェクトを割り当てることができます。

ptはARRAY文字へのポインタを指し示すポインタであるARRAYですが、

ptは配列である。配列そのものは指さない。 1つの文字を指すポインタを指すポインタを含みます。単一の文字が配列(文字リテラル)に入っているだけですが、その事実はptの型では決して記述されません。


PS。文字列リテラルをchar*に変換しています。このような暗黙的な変換は、C++ 11以来の形式ではありませんでした。 C++ 11以前であっても、変換は非難されました。

関連する問題