2017-07-28 5 views
-1

1次元配列の場合、配列要素へのアクセスに問題はありません。例えば ​​-多次元配列をポインタ形式で表現する方法は?

#include<typeinfo> 
#include<iostream> 
#include<vector> 
using std::cin; 
using std::cout; 
using std::endl; 
using std::vector; 
using std::string; 
int main() 
{ 
     int a[3] = {1, 2, 3}; 
     cout << *(a + 0); 
     return 0; 
} 

しかし、私は2次元配列のためにしようとしていたとき、私は種類の出力を取得しています -

#include<typeinfo> 
#include<iostream> 
#include<vector> 
using std::cin; 
using std::cout; 
using std::endl; 
using std::vector; 
using std::string; 
int main() 
{ 
     int a[][3] = {1, 2, 3}; 
     cout << *(a + 2); 
     return 0; 
} 

出力 -

0x7ffca0f7ebcc 

どのようにすることができます最初の例で説明した形式で出力を2にします(行のメジャーまたは列のメジャー順で2を取得しますが、C++では行のメジャー配列表現に従います)。生のアレイについて

+0

これは、2番目の場合の '*(a + 2)'が 'int(*)[3]'の結果をもたらすため、ポインタが出力されるためです。今、あなたはどのようにポインタからオブジェクトを取得しますか? (また、無関係のインクルードと使用方法は何ですか...) – DeiDei

答えて

1

これにより、最初の行の3番目の要素が得られます。

#include <iostream>  
int main() 
{ 
    int a[][3] = {1, 2, 3}; 
    std::cout << *(*a + 2); 
} 

a[0][2]がわかりやすいかもしれませんが、

0

は、C++は、二次元アレイにアクセスする

*(a + i); 

に変換さ

a[i] 

そのCからルールを継承し、我々は二回このルールを適用することができる:

a[i][j] => *(a[i] + j) => *(*(a + i) + j) 

明らかに、a[i][j]の構文ははるかに理解しやすいですが。

関連する問題