2012-02-09 14 views
3

intの値をポインタ変数に保存します。しかし、私はエラーを取得する:intをポインタに変換する

#include <iostream> 
using namespace std; 

int main() 
{ 
    int *NumRecPrinted = NULL; 
    int no_of_records = 10; 
    NumRecPrinted = (int*)no_of_records; // <<< Doesn't give value of NumRecPrinted 

    cout << "NumRecPrinted!" << NumRecPrinted; 
    return 0; 
} 

は、私はこれをやってみましたが、私はリターンとして0を得る:

int main() 
{ 
    int demo(int *NumRecPrinted); 
    int num = 2; 
    demo(&num); 
    cout << "NumRecPrinted=" << num; <<<< Prints 0 
    return 0; 
} 

int demo (int *NumRecPrinted) 

{ 
    int no_of_records = 11; 
    NumRecPrinted = &no_of_records; 
} 

ここで0

+1

あなたはエラーが何であったか私たちに語ったことはありません。 –

+0

なぜそれをしたいですか?整数をポインタに変換する理由はあまりありません。そのため、あなたがしようとしていることが何らかの形でうまく実現していないかどうか疑問に思っています。あるいは、整数へのポインタを得ることを意味しますか?* –

+0

私はポインタを返す必要がある関数の中でこれをやっています。 –

答えて

2

あなたは、このやっているしたい:

NumRecPrinted = &no_of_records; 

つまり、あなたがno_of_recordsのアドレスを取得し、NumRecPrintedに割り当てています。

それを印刷する

そして:

cout << "NumRecPrinted!" << *NumRecPrinted; 

つまり、あなたがNumRecPrintedを逆参照しているintは、メモリアドレスに格納されてしまいますNumRecPrintedによって指さ。

+2

いいえ、私は彼がポインタに「10」を「エンコード」しようとしていると思います。 –

-1

が修正版であるようNumRecPrintedが返されます。

#include <iostream> 
using namespace std; 
int main() 
{ 
    int *NumRecPrinted = NULL; 
    int no_of_records = 10; 
    NumRecPrinted = &no_of_records; // take the address of no_of_records 

    cout << "NumRecPrinted!" << *NumRecPrinted; // dereference the pointer 
    return 0; 
} 

追加されたアンパサンドとアスタリスクに注意してください。

+0

いいえ、私は彼がポインタに「10」を「エンコード」しようとしていると思います。 –

0

(int *)no_of_recordsは、アドレスno_of_recordsへのポインタを示します。 no_of_recordsの値を指すポインタを取得するには、&no_of_recordsと記述する必要があります。

+0

いいえ、私は彼がポインタに「10」を「エンコード」しようとしていると思います。 –

4

pthreadsスレッド引数()にデータを渡す必要がある場合など、非ポインタ値をポインタに "エンコード"すると便利なことがあります。

C++では、これをハッカーで行うことができます。 Cスタイルのキャストはこの牛車の例であり、実際your program works as desiredに:

#include <iostream> 
using namespace std; 

int main() 
{ 
    int *NumRecPrinted = NULL; 
    int no_of_records = 10; 
    NumRecPrinted = (int*)no_of_records; 

    cout << "NumRecPrinted!" << NumRecPrinted; // Output: 0xa (same as 10) 
    return 0; 
} 

あなただけ0xaは小数点10の16進表現であることを認識する必要があります。

ただし、このハックです。 一般では意味がないので、intをポインタに変換することはできません。実際には、pthreadsの場合でも、渡すデータをカプセル化する構造体へのポインタを渡す方がはるかに論理的です。

だから、基本的には... "しない"。

+1

しかし、あなたがしなければならない... [intptr_t](http://stackoverflow.com/questions/6326338/why-when-to-use-intptr-t-for-type-casting-in-c) – Useless

+1

..または少なくともstatic_assert(sizeof(int)> sizeof(void *))の場合、intのサイズはポインタのサイズ以上でなければなりません。 –

+0

あなたはどちらも絶対に正しいです。 –

0

私は本当にもののこの種のために労働組合を使用してのような:

#include <iostream> 
using namespace std; 

int main() 
{ 
    static_assert(sizeof(int) == sizeof(int*)); 

    union { int i; int* p; } u { 10 }; 

    cout << "NumRecPrinted! " << u.p; 
    return 0; 
} 
0
#include <iostream> 
using namespace std; 

int main() 
{ 
int *NumRecPrinted = NULL; // assign pointer NumRecPrinted to be valued as NULL 
int *NumRecPrinted2 = NULL; 
int no_of_records = 10; // initialize the value of the identificator no_of_records 
NumRecPrinted = (int*)no_of_records; // sets a pointer to the address no_of_records 
NumRecPrinted2 = &no_of_records; // gives a pointer to the value of no_of_records 

cout << "NumRecPrinted!" << NumRecPrinted; // address of no_of_records 0000000A 
cout << "NumRecPrinted!" << *NumRecPrinted2; // value of no_of_records 10 
system("pause"); // ninja 
return 0; 
} 
+1

なぜインデントがないのですか?なぜsystem( "pause") 'を追加したのですか?そうすれば、赤ちゃんのイエスが泣くのです。 –

関連する問題