• ベストアンサー

C言語のポインタに直接アドレスを割り振りしたい

C言語のポインタに直接アドレスを割り振りしたいのですが、どうしたら良いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • nitscape
  • ベストアンサー率30% (275/909)
回答No.1

直接アドレスを割り振りたい、というのは int* pnValue; pnValue = (int*)0x12345678 ということでしょうか?このようにすればポインタにアドレスを代入することはできるかと思います。

systama
質問者

お礼

nitscapeさん、早々の書き込みありがとうございます。 早速試してみたいと思います。

その他の回答 (4)

  • ara_ara
  • ベストアンサー率35% (124/348)
回答No.5

>CPUは内部32ビットですが、INTは16ビットです。 で、CPUのアドレス空間は16/32ビットどちらですか? また、ポインタ型のサイズは16/32ビットどちらですか?

systama
質問者

お礼

アドレス空間は24ビットで、ポインタ型のサイズは事実上可変長です。 が、みなさんの回答で少しわかってきましたのでどうにかなりそうです。 書き込みをくれたみなさん、ありがとうございました。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.4

>メーカーのコンパイラのスタートアップルーチンでは、メモリクリアもインラインアッセンブルで書いていますから、 >直接番地指定時はインラインアッセンブル以外方法はないものかと半ばあきらめています。 だとすると#1の方の回答のように直接アドレスを入れたので問題ないと思います。 int* p = (int*)0x12345678; *p= 65535;

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

デバイスを制御する目的であれば、例えば volatile unsigned int *io = 0x1234; のようにするとよいでしょう。 特に入力専用の場合には、 const volatile unsigned int *in = 0x1234; とした方が無難です。 フラッシュメモリの種類にもよりますが、書き換えコマンドを期待したシーケンスで発行するためには、volatile修飾が不可欠です。 また、デバイスの種類やモードによっては、アクセスすべき語長が異なるので、必要に応じてunsigned charやunsigned longなどを使うべきです。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

例えばWindowsやlinuxの場合で 物理メモリのアドレスを直接指定したいというならそれは無理。 Windowsの場合プロセス毎に仮想メモリ空間を割り当てられており 例えばmalloc等で取得したアドレス=実際の物理メモリのアドレスではない。 意図的にしない限り、誤って他のプロセスのメモリ破壊するような事も 基本的に無いのです。 物理メモリのアドレスはOSが管理しているものです。 >直接アドレスを割り振りしたいのですが 何をしたいのかがもっと具体的に分かれば、詳細な回答を期待 できるかもしれませんよ?

参考URL:
http://nienie.com/~masapico/doc_MemMan.html
systama
質問者

お礼

sha-girlさん、書き込みありがとうございます。 何をしたいか詳しくいいますと、 フラッシュROM内蔵のCPU(制御機器)のプログラムをアセンブラ記述からC記述へ変更しています。 CPUは内部32ビットですが、INTは16ビットです。 フラッシュROM内のデータを書き換えるとき、どうしても直接番地指定が必要となります。 メーカーのコンパイラのスタートアップルーチンでは、メモリクリアもインラインアッセンブルで書いていますから、直接番地指定時はインラインアッセンブル以外方法はないものかと半ばあきらめています。 アセンブル記述で(XHL)や(M)などが行いたいのですが。 宜しくご教示お願いします。

関連するQ&A

  • C言語のポインタとスタックポインタ

    プログラム始めて1ヶ月の初心者です。 C言語のポインタとスタックポインタというのは同じなのでしょうか。 スタックポインタの考えは大体理解出来たのですが C言語のポインタとなるとコードを見てもサッパリ分かりません。 ネットで調べても出てこなかったのでどなたか教えて下さい。 よろしくお願いします。

  • アドレスとポインタがどうしても理解できない

    C言語を独学しているのですが、どの参考書読んでも、アドレスとポインタの理解ができません。アドレスとポインタを使わなくても別に開発できるのではないかと思います。どなたか、アドレスとポインタを初心者でも分かるように分かりやすく教えて頂けないでしょうか?

  • C言語のポインタについて

    C言語のポインタ(配列もポインタに含まれるのか?)について質問です。 係数を行列形式で表される状態方程式などの2変数以上の方程式を解くプログラムにおいてよくポインタや配列が使われているのですが、なぜポインタや配列を使うのでしょうか?利点など詳しく教えていただけませんでしょうか。。。 どなたか分かる方よろしくお願いします(*_*)

  • VBでC言語のポインタみたいな使い方?

    VBでC言語のポインタみたいに、一個の関数に配列のアドレスを渡して汎用的に使える方法は出来ますでしょうか? 宜しくお願いします。 PS:配列のデータは直線を描く為のデータです。

  • C言語で ポインタって どういうメリットがあるの?

    C言語で ポインタって どういうメリットがあるのでしょうか? 使用例とかも教えてくれたら うれしいです

  • C言語のポインタについて教えてください。

    C言語のポインタについて教えてください。 ・pointer1.c  int main(){   int a;   int *p;   p = &a;     a = 123;   printf("%d", *p);   return 0;  } ・pointer2.c   int main(){ int a[100]; int *p; p = &a[0]; int i; for(i = 0; i < 100; i++) a[i] = i; for(i = 0; i < 100; i++) printf("%d", *p++); return 0; } と二つのソースコードがあるとき、pointer2.cの「p = &a[0]」をpointer1.cのように「p = &a」と書けないのはなぜですか?  また、「&a」は動かすことのできなく、「aを指し示す*p」は動かすことができる変数のようなもの、という認識に誤りはないでしょうか?  宜しくお願いします。

  • C++言語のポインタについて

    現在、C++言語を学習しているのですが、 ポインタを使わない、 int main() { Human human; human.Introduction(); } と、ポインタを使った、 int main() { Human *p; p = new Human; p->Introduction(); delete p; } があります。どちらも同じ動作をしますが、ポインタを使ったものがよく使われているのは、 メモリの節約?動作速度?のためなのでしょうか? なぜ使われるのか教えてください。

  • C言語のポインタの利点がわかりません

    C言語を始めたばかりですが、 ポインタで間接参照するメリットが今一つわかりません。。。 特に、関数ポインタを使う場合には、 単なる関数ではだめなのでしょうか。 どなたか、かみ砕いて教えていただけないでしょうか。

  • C言語 ポインタと配列

    C言語で配列をあつかう場合、ポインタをつかうか、配列の添え字を使って処理するか迷うのですが、どちらが良いのでしょうか? 処理速度ではどちらが上でしょうか?

  • C言語の勉強中です

    C言語の勉強中です。自分の参考にしている本でよくわからないところがあったので教えてください 本には、NULLポインタは、すべてのビットが0であり、どこのアドレスも指さないポインタのことと書いてあるのですが、アドレスは0から始まるから、実際はアドレスの0番地を指していますよね? どこのアドレスも指さないと言いつつ、実際は0番地を指しているあたりがよくわかりないので教えてください