2017-01-15 9 views
0

私はC/C++の初心者であり、ポインターを学習しようとしています。ここでint型のポインターの代わりにvoidポインター

は、データ配列の要素を指し、ポインタ配列の各要素にポインタの配列を作成するための私のコードです:

#include <iostream> 
using namespace std; 

//Pointers reference article 
//https://www.programiz.com/cpp-programming/pointers-arrays 

/* Array of pointers */ 
const int MAX = 5; 
int main(){ 
    int arr[MAX] = {1,2,3,4,5}; 
    int* ptr[MAX]; 

    cout << "Create the handle of each element in data array to the ptr array: " << endl; 
    for (int i=0; i<sizeof(arr)/sizeof(arr[0]);i++) 
    { 
     ptr[i] = &arr[i]; 
     cout<<"ptr["<<i<<"] = " << ptr[i] << endl; 
    } 

    cout << "Display the contents of array using 1:1 ptr array:"<< endl; 
    for (int i=0; i<sizeof(arr)/sizeof(arr[0]);i++) 
     cout<<"arr["<<i<<"] = " << *ptr[i] << endl; 

    system ("pause"); 
    return 0; 
} 

予想通り、上記のプログラムが動作します。しかし、ポインタの型をintからvoidに変更すると、ポインタ宣言時に int * ptr [MAX];のようになります。 to void * ptr [MAX];

私はこのエラーがあります:CPP(22):エラーC2100:違法間接

Line 22: cout<<"arr["<<i<<"] = " << *ptr[i] << endl 

誰かがこのエラーで私を教育してくださいすることができます。前もって感謝します。

+4

'void *'を逆参照すると、 'void'が得られます。私は本当にあなたが何をすることを期待するか分からない。 – Dolda2000

+1

言語C/C++はありません。 1つの異なる言語CとC++。このコードは明らかにCではありません。 – Olaf

+1

'void'ポインタの全体点は、型に関係なく(ほぼ)何かを指すことができるため、ポインタの型は不明です。 'ptr [i]'がポインタであるところの '* ptr [i]'のように)ポインタを逆参照するには、そのポインタが指しているもののタイプを知っていなければなりません。 – Peter

答えて

4
int* ptr[MAX]; 

ptrintへのポインタの配列である、ボイドポインタを避けてください。

あなたは

void* ptr[MAX]; 

に変更すると、その後ptrvoidへのポインタの配列です。すなわち、第一cout

cout<<"ptr["<<i<<"] = " << ptr[i] << endl; // ok - printing the address 

にエラーが発生することはありません。しかし、それは第二のエラーです:

cout<<"arr["<<i<<"] = " << *ptr[i] << endl; // error - dereferencing void pointer 

あなたはvoidポインタデリファレンスすることはできません - それは何についてのエラーです。逆参照される特定の型のポインタでなければなりません。

2

あなた自身に質問する必要があります - 無効とはどういう意味ですか?

ですから、ボイドポインタを持っている - これは何もすることができ、ボイド

に指す意味 - 任意のint型、構造、オブジェクト、フロート....

画像を入手します

コンパイラはそれを逆参照しようとしています - それで、それは手を保持し、言います - 私は手がかりを持っていません。

それどちらの場合 - またはより良いまだ

関連する問題