質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

10831閲覧

アドレスを表すときの書式指定フィールドは?

tadanoosakana

総合スコア30

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/11/03 12:15

ロベールのC++教室 (http://www7b.biglobe.ne.jp/~robe/cpphtml/mainmenu.html)
を読んでいて疑問に思ったことがあります。

イメージ説明

printf関数を使っているようですが、
私は アドレスを表す書式指定フィールド を %p と習いましたが、
サイトでは %d と書かれています。

%p というのは間違いなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

いいえ。%pで合ってます。
integer型とポインタ型の長さが等しいと分かっているときには、%dでも大丈夫です。

昔は%pとか無かったので、長さを確認した上で%dや%ldなどを使っていました。そのころの癖が抜けない人のコードではないでしょうか。

投稿2015/11/03 13:00

otn

総合スコア86281

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tadanoosakana

2015/11/03 13:04

確かにこのサイトは古いかもしれませんね。
guest

0

ベストアンサー

いえ、%pであっていますよ。
%pは頭に0xをつけて16進数で表示されると思います(0xがつくかどうかはライブラリによるみたいですけど)
%dは渡された値をint型とみなして10進数で表示します。
%dでポインタを表示するとint型とポインタ型のサイズが違う環境では正しい結果が出なくなります。

投稿2015/11/03 12:50

toki_td

総合スコア2850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tadanoosakana

2015/11/03 13:03

今試してみました。 %p の場合と %d の場合で比べてみました。 Xcode のデフォルト設定のままでコンパイルすると 「int* 型を int 型 で表示しようとしちゃっていますよ」的な警告がでました。 実行すると %d でも一応10進数で表示されましたが、 その10進数を %p の出力で得た16進数に直しても 同じ値にはなりませんでした。 サイトではなぜ %d を使ったのかは分かりませんが、 %p だということがはっきりして良かったです。 ありがとうございます。
guest

0

検証コード書いているうちにベストアンサー出ちゃったけど、ついでなので。

printfの可変長部分は厳密な型チェックしてくれないのでポインタを無理矢理整数として解釈できてしまいます(賢いコンパイラは警告を出してあげますが、無視してコンパイルできます)。なので、ポインタをむりやりint型と解釈して、%dを使って出力しているのです。%pを使わなかったのは、ポインタは本当にただの整数ですよってことを表したくて、整数として解釈した場合としたかったのではなかったのではないでしょうか。

で、サイトのコードには大きな問題があります。それはポインタのサイズとintのサイズが同じとは限らないと言うことです。なので、そのコードではintに収まらなかった分が切り捨てられた値が出力される場合があります。ではどうするかというと、C言語には必ずポインタのサイズ以上になるintptr_tと言うのが用意されています。ということであらかじめintptr_t型にキャストして置けば警告もでず、安心できます。でも、今度はprintfで問題があります。printfにはintptr_tのための%○というのがありません。そこで、printf等にintptr_tを使うためのPRIdPTRというマクロを使います。つまり、下のようなコードにすると警告も出ず、サイズ問題も解決したプログラムができあがります。

C++

1#include <stdio.h> 2#include <stdint.h> 3#include <inttypes.h> 4 5int main() 6{ 7 int a; 8 char b[10]; 9 printf("a : %" PRIdPTR "\nb : %" PRIdPTR "\nmain : %" PRIdPTR "\n", 10 (intptr_t)&a, (intptr_t)b, (intptr_t)main); 11 return 0; 12}

ただ、非常に残念なことにVisual StudioのC++コンパイラはPRIdPTR等に対応していません。Visual Studioを使いたいのであれば、ポインタのサイズとint, long, long long等のサイズを比較して適切な整数型を選ぶ必要があります。

投稿2015/11/03 13:38

raccy

総合スコア21741

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問