const char* string = "Hello World\n"; float* p_pi; float pi = 3.14f; p_pi = π //p_pi = &(3.14f);
コメントアウトしたような書き方だと&はビット演算子になるのかエラーとなりダメです。
文字列リテラルの例のように、一度変数を介さないでアドレスを取得する方法はありませんか?
どうしてそんなことをしたいのか、に興味がありますね。
配列が引数の関数に定数1個を渡したいとか?
可変引数の一般的なマクロ(va_argとか)を使わずに、可変の引数の関数を作りたくて配列を渡したいと思っています。void型のポインタの配列で、あらゆる型の値のアドレスの入る配列です。
それに文字列定数を入れる場合は例のように入れられますが、単なる数値はいちいち変数を個数分宣言してそれを介して入れなければならないのが嫌だなぁと思っています。
例えばこんな感じです
void* wk[128];
int year, month, day;
//printf("%s%d%d%d", "Happy New Year", 2022, 1, 1);
wk[0] = "Hello World";
year = 2022;
month = 1;
day = 1;
wk[1] = &year;
wk[2] = &month;
wk[3] = &day;
print_array("%s%d%d%d", wk);
//こんな風に定数を直接参照したい、変数の宣言も代入も減らしたい
//wk[1] = &2022;
//wk[2] = &1;
//wk[3] = &1;
数値は(恐らく、一般的には)アセンブラコードのオペランドとして直接使用されますので、アドレスは存在しないでしょう。
(自己書き換えが出来るような)昔の CPU のアセンブラであればコードのオペランドを参照するコードは書けますが、そのような危険なコードは今は書けないのではないでしょうか。
//俺は sizeof(void*) の大きさを信じてるぜ!
wk[1] = (void*)2022; //くらえオラァ!
とかいうのは,やっちゃいけないことなのかな?
Jimbeさん、すみません。よくわかりませんでした。
オペランド「として」というのは、パソコンでいうとHD上の実行ファイルのH定数の部分がメモリではなくCPUのレジスタに読み込まれ、そのレジスタを参照されるのでアドレス指定でアクセスできないという感じですか?
H8マイコンを使用しているのですが、ファームを書き込んだフラッシュ領域のどこかにはあるのではないでしょうか?マップファイルを見ると配置されているようなのですが。
知識が足りず頓珍漢なことを言っていたら申し訳ありません。
H8 やご利用のコンパイラの仕様は分かりませんが、
> 定数の部分がメモリではなくCPUのレジスタに読み込まれ
では無く、C をアセンブラコードに変換する際に「" CPU のレジスタに値を設定する命令"の"値"部分として表れる」というようなことです。
>マップファイルを見ると配置されているよう
と言われても、お使いの C の仕様でそのマップファイルの情報通りの領域に直接アクセス出来る方法が無ければ、C の標準的な操作・動作しか出来ないでしょうし、マップファイル等は単なる実装形式の一部を覗き見したというだけでしょう。
C の自由度が高いとはいえ、それは当然 C の言語的有効範囲内でですので、人間に見えるモノが全て利用できるとは限りません。
Jimbeさん、ありがとうございます。
パソコンでいえばHD上からレジスタに読み込む命令に、H8でいえばフラッシュからレジスタに読み込む命令に置き換えられる。それらにCでアドレス指定でアクセスする方法がないと無理ということですか。
どうにもならなそうですね・・・。
(angel_p_57さんの回答に気が付かず同じことを書いたので削除)
興味深い話題ですが、C言語の規格・仕様上での話と、お使いのCコンパイラ、実行環境でできることの可否を分けて考えて結論付ける必要があるかと思います。
wk[1] = 2022;
wk[2] = 1;
wk[3] = 1;
とした後、&wk[n] でいいのでは?
コメントから察するに、.NETのObject型や、VBのVariant型的な事をしたいんでしょうが、C言語の範疇で似たような事をやろうとすると、普通にコーディングするより逆に面倒になります。
VC++のヘッダでVARIANTの中身見ると、色々な型を詰め込んだ共用体だった記憶があります。
回答3件
あなたの回答
tips
プレビュー