2017-02-07 5 views
0

私はこのような状況をどう対処するのかを助ける必要があります。 変数DestinationAddressには、メモリの開始値が入っています。そして私はデータをアドレスに書き込むためにポインタを使いたい。大丈夫ですか?ポインタで変数に格納されているアドレスを扱う方法は?

例:

long Data32; 
long DestinationAddress; 
long *temp; 

Data32 = 0x00112233; 
DestinationAddress = 0x00280000; 
temp = DestinationAddress; 
*temp = Data32; 
+1

使用コードブロックと適切な形式。 – tambre

+2

私はあなたの例を理解しているのか分かりませんか? – Borgleader

+0

「これでいいですか?」あなたは私に言います、あなたはそれを試しましたか? – tambre

答えて

3

あなたの変数は以下のように宣言された場合:

long Data32; 
long DestinationAddress; 
long *temp; 

あなたは

あなたが使用すること
temp = DestinationAddress; 

を使用することはできません

temp = &DestinationAddress; 
使用後

、:

*temp = Data32; 

Data32DestinationAddressの値を設定するための有効な方法です。

ただし、DestinationAddressという名前とそれを宣言するために使用された型は、longと一致していないようです。あなたはDestinationAddresslongのアドレスを格納する場合、それはとして宣言する必要があります

long* DestinationAddress; 

あなたはアドレスを格納する代わりにlong*の整数型を使用したい場合は、使用するタイプがintptr_t or uintptr_tあります。

uintptr_t Data32; 
uintptr_t DestinationAddress; 
uintptr_t* temp; 

Data32 = 0x00112233; 
DestinationAddress = 0x00280000; 
temp = &DestinationAddress; 
*temp = Data32; 

更新、OPのコメント

に応じて、あなたが使用する必要があります。

long Data32; 
uintptr_t DestinationAddress; 
long* temp; 

Data32 = 0x00112233; 
DestinationAddress = 0x00280000; 
temp = (long*)DestinationAddress; 
*temp = Data32; 
+0

@R Sahu DestinationAddressの値をData32に設定したくありません。 Data32でメモリ(実際にはDestinationAddressに格納されている0x00280000)を設定したいと思います。 –

+0

@PepeEsteban、更新を参照してください。 –

+0

@R Sahuあなたの答えをありがとう –

-1

それは限り0x00280000が有効なアドレスであるとして罰金だ - しかし、あなたが本当に可能な(の代わりに、あなたの例ではlong)場合は、ポインタ値を格納するためuintptr_tを使用することを検討すべきです。

ただし、DestinationAddressは整数です。だから、あなたはケース(そうでない場合、コンパイラはそれについて警告するかもしれない)でそれを変換する必要があるだろう:組み込みシステムで

temp = (long*)DestinationAddress; 
*temp = Data32; 
+1

これ以上の情報はありませんが、これはOKではありませんが、UBを呼び出します。 – Olaf

+0

@usrはい有効なアドレス(RAMメモリ)です。私は 'uintptr_t'を利用できないのですか?私の "コード"の形式をどうやって変えましたか? –

+0

@Olaf UBとはどういう意味ですか? –

0

は、多くのハードウェア・レジスタは、特定のアドレスに配置されています。ソフトウェアは、これらのアドレスに対して書き込みおよび読み取りを行う必要があります。

古典(Cスタイル)イディオムは次のとおりです。

#define USB_STATUS_REGISTER ((uint16_t *) (0x40008250)) 
uint16_t const * const p_status_register = USB_STATUS_REGISTER; 
uint16_t status = *p_status_register; 
+0

私のアドレス0x00280000はRAMメモリです –

+0

@PepeEsteban:この場合、リンカを使用してRAM領域を設定してください。あなたのコードでそのようなアドレスを使うのは悪い考えです。 – Olaf

+0

@Olaf RAMをセットアップすることは何を意味するのか分かりません。何をすべきかを示す例はありますか? –

関連する問題