掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.30171

アドレスについて
投稿者---kokosan60(2007/05/22 22:29:16)


以下のプログラムについて、y、wのアドレスがそれぞれ0012FF60、0012FF54となったのですが、同じ値でないのはなぜなのですか?
#include <stdio.h>
int main(void)
{
int x,y;
int *w;

x=10;
w=&x;
y=*w;

printf("%p\n",w);
printf("%p\n",&y);

return (0);
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:アドレスについて 30172 金魚ちゃん 2007/05/22 22:40:12
<子記事> Re:アドレスについて 30175 bugs 2007/05/22 22:48:29
<子記事> Re:アドレスについて 30180 YuO 2007/05/23 02:47:52


No.30172

Re:アドレスについて
投稿者---金魚ちゃん(2007/05/22 22:40:12)


♪メモリのアドレスです。
x = 0012FF50
y = 0012FF54
w = 0012FF60

>printf("%p\n",&y);
としているのでいつも y のアドレスを表示します。
正しくは printf("%08X\n",y); とします。これなら w と同じになります。



この投稿にコメントする

削除パスワード

No.30174

Re:アドレスについて
投稿者---金魚ちゃん(2007/05/22 22:42:18)


♪追記。
あと y = (int)w; にしないと駄目だね。



この投稿にコメントする

削除パスワード

No.30182

Re:アドレスについて
投稿者---YuO(2007/05/23 02:53:09)


突っ込みどころ満載なので……。


>♪メモリのアドレスです。

なぜそういう結論になるのでしょうか。


>x = 0012FF50
>y = 0012FF54
>w = 0012FF60

???


>>printf("%p\n",&y);
>としているのでいつも y のアドレスを表示します。
>正しくは printf("%08X\n",y); とします。これなら w と同じになります。

ちゃんとC言語という物をわかっていますか?
オブジェクトへのアクセスには型が関連します。
どうも,それが全くわかっていないように思えます。

それに,ポインタを出力するためには%pを使うのであって%08Xに相当する箇所にポインタを渡した場合は未定義動作とされています。



この投稿にコメントする

削除パスワード

No.30175

Re:アドレスについて
投稿者---bugs(2007/05/22 22:48:29)


2つのprintf()の結果が異なるのはどうしてか、ということですか?

>    w=&x;  

wにはxのアドレスが入ります。yのアドレスではありません。

>    printf("%p\n",w);
>    printf("%p\n",&y);

w(xのアドレス)とyのアドレスは、違っていて当然です。



この投稿にコメントする

削除パスワード

No.30180

Re:アドレスについて
投稿者---YuO(2007/05/23 02:47:52)


とりあえず,アドレスって何?と聞いておきます。
# なぜにポインタという言葉を使わないのかが理解できない。


> y=*w;

これは,wという名前のついたポインタオブジェクトの指すオブジェクトの値を,yというオブジェクトにコピーしています。
# 値をコピーしているのであって,オブジェクトへのポインタをコピーしているのではない。


> printf("%p\n",w);

wはxへのポインタを保持していますから,xへのポインタを可視化した物が標準出力に出力されます。

> printf("%p\n",&y);

&yはyへのポインタを生成しますから,yへのポインタを可視化した物が標準出力に出力されます。


この投稿にコメントする

削除パスワード

No.30184

Re:アドレスについて
投稿者---円零(2007/05/23 12:26:11)


>とりあえず,アドレスって何?と聞いておきます。
># なぜにポインタという言葉を使わないのかが理解できない。

まあ普通に考えて、アドレスとはアドレス演算子の結果の値(及びそれと同等のもの)のことでしょう。
C言語では偶々、アドレス演算子の結果がポインタ型であるので
そのままポインタとして使用できるだけに過ぎません。
また、「ポインタ」という用語には、型を示す名前としての意味と
なんらかのオブジェクトを指しているもの、としての意味の二通りがありますから、
異なる用語を当てたくなることに何ら不思議はないと思います。


この投稿にコメントする

削除パスワード

No.30203

Re:アドレスについて
投稿者---YuO(2007/05/26 14:54:06)


>C言語では偶々、アドレス演算子の結果がポインタ型であるので
>そのままポインタとして使用できるだけに過ぎません。

うーん,「ポインタ」が先にあってそれを取得する演算子に「アドレス演算子」と名付けたのではないでしょうか。
# 歴史的にどうこうではなく,規格から読み取れる範囲では。

アドレス演算子の結果がポインタでないならば,
その戻り値はオブジェクトを参照するのに使えないわけですから,
その結果は使い物にならないです。


この投稿にコメントする

削除パスワード

No.30204

Re:アドレスについて
投稿者---たかぎ(2007/05/26 15:34:36)
http://takagi.in/


>まあ普通に考えて、アドレスとはアドレス演算子の結果の値(及びそれと同等のもの)のことでしょう。

Cの規格の中で、アドレスが具体的どんなものなのかを記述しているのは「6.5.3.2 アドレス及び間接演算子」のところだけだったと思うので、そう考えるのが妥当でしょうね。
ただ、そこでいうアドレスは(オペランドが指し示している)オブジェクトのアドレスであって、

>♪メモリのアドレスです。

となると、ハードウェアの仕様が絡んできます。しかも、プロセッサの〜ではなく、メモリの〜ですから、実際にどんなデバイスがどのように実装されているかに依存しますね。仮想アドレスの場合は、MMUの状態も絡んできます。

まあ、質問者さんが環境を書いていないのも悪いのですが、実装されているメモリデバイスのアドレスの話をしているわけではないことは十分察しが付きますから、「メモリのアドレス」という表現が不適切なことは確かです。

# 個人的にはそこまで目くじらを立てなくても良い気はしますが...



この投稿にコメントする

削除パスワード

No.30201

Re:アドレスについて
投稿者---pie(2007/05/26 01:13:28)


>とりあえず,アドレスって何?と聞いておきます。
># なぜにポインタという言葉を使わないのかが理解できない。

なぜ理解できないのかが理解できない。
教えてください。



この投稿にコメントする

削除パスワード

No.30202

Re:アドレスについて
投稿者---YuO(2007/05/26 14:44:55)


>>とりあえず,アドレスって何?と聞いておきます。
>># なぜにポインタという言葉を使わないのかが理解できない。
>なぜ理解できないのかが理解できない。
>教えてください。

文脈上アドレスではなくポインタという言葉を使うべきところであるからです。
正しく意味を伝えることのできる「ポインタ」という言葉を自ら放棄して,意味が相手に伝わるかどうか不明である「アドレス」なる言葉を使う根拠を私は見いだせませんでした。

規格 (ISO/IEC 9899:1999) から関連しそうな部分を引用しておくと,
  • 6.2.5 Types / Paragraph 20
    • A pointer type may be derived from a function type, an object type, or an incomplete type, called the referenced type. A pointer type describes an object whose value provides a reference to an entity of the referenced type. A pointer type derived from the referenced type T is sometimes called "pointer to T".
  • 6.2.5 Types / Paragraph 26
    A pointer to void shall have the same representation and alignment requirements as a poitner to a character type.
  • 6.3 Conversions / 6.3.2.3 Pointers / Paragraph 1
    A pointer to void may be converted to or from a pointer to any incomplete or object type. A pointer to any incomplete or object type may be converted to a pointer to void and back again; the result shall compare equal to the original pointer
  • 7.19.6.1 The fprintf function / Paragraph 8
    p
    The argument shall a pointer to void. The value of the pointer is converted to a sequence of printing characters, in an implementation-defined manner
  • 7.19.6.3 The printf function / Paragraph 2
    The printf function is equivalent to fprintf with the argument stdout interposed before the arguments to printf
と,関係する箇所からポインタという言葉は定義が出てきますが,アドレスという言葉は出てきません。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧