🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

ポインタ

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

Q&A

2回答

1586閲覧

ポインタのアドレスを表示するプログラム。コンパイルエラーを解決したい

NT1010

総合スコア4

C

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

ポインタ

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

0グッド

1クリップ

投稿2019/10/20 03:16

編集2019/10/20 03:57

前提・実現したいこと

printf("%04x",pa);
でポインタの指すアドレスを表示させたいのですが、%04xの部分がエラーになります。

↓が実際のプログラムです。

#include <stdio.h>

int main(void) /ポインタのアドレス計算/
{
static int a[]={0,1,2,3,4};
static char b[]={'a','b','c','d','e'};
int i,*pa;
char *pb;

pa=a; pb=b; for (i=0;i<5;i++) { printf("%04x %4d : %04x %c\n",pa,*pa,pb,*pb); pa++; pb++; }

}

発生している問題・エラーメッセージ

argument has type 'int *' [-Wformat]
printf("%04x %4d : %04x %c\n",pa,*pa,pb,*pb);
~~~~~ ^~
pointer11.c:14:48: warning: format specifies type 'unsigned int' but the
argument has type 'char *' [-Wformat]
printf("%04x %4d : %04x %c\n",pa,*pa,pb,*pb);
~~~~~ ^~
%4s

該当のソースコード

c言語

試したこと

ネットで調べたのですが、このコードで間違ってはいないと思います。しかし、エラーになります。

補足情報

使用しているパソコンはMACです。
コンパイラはterminalです。
よろしくお願い致します。

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

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

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

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

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

SaitoAtsushi

2019/10/20 06:48

デスクトップから terminal というソフトを起動したからそれがコンパイラだと誤解しているのだと思います。 簡単に言うと terminal は文字の表示やキーボードからの入力を受け付けるソフトです。 ターミナルを経由して入力された内容をコマンドを解釈するソフト (シェル) が理解し、更にコマンドに対応したソフトを走らせます。 つまり、このとき入力したコマンドがコンパイラだと考えれば良いです。 実際にはそのコマンドはコンパイラドライバで、更に個別の処理を担当するソフトを起動したりするのですが、詳細を説明しようとするときりがないのでここでは省略します。 とりあえずどのようなコマンドを入力してコンパイルしたか提示すると手っ取り早いです。 (この質問の場合はコンパイラの違いはそれほど重要ではありませんが……。)
guest

回答2

0

%xは整数型の値を表示する指示、これに対して整数型ではなくポインタが与えられたのでコンパイラが警告を出したのでしょう。
ポインタは整数型に変換できることになってはいるので間違いと断じるのもナンですが、正しいとも言いきれず。だからエラーではなく「警告」。

なぜなら、ポインタの値(つまりアドレス値)を表示するための書式指定子 %p ってのがありますから。
こちらを使うのがスジ、ということでしょう。

投稿2019/10/20 03:45

thkana

総合スコア7703

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

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

NT1010

2019/10/20 03:57

回答ありがとうございます!参考にしてみます。
guest

0

printf("%04x",pa);

paの型は何でしょう?
エラーメッセージから、推測すると、char * でしょうか?
でエラーメッセージが言うところでは、Formatの期待する型はunsigned intだが、実際の引数は、char *となっている、、、と。

確かに私の知っている(古い)Cは、この形式で問題無かったですが、最近のコンパイラは、型の確認が厳密になったかもです。 (詳しい人の説明があるかも)
また、使っているコンパイラなどについても、説明が無いので、それがあると確認ができます。

ただ、簡単には、 (unsigned int)pa とすれば、ポインタが unsigned int にキャストされるので、アドレスが出力されると思いますが、どうでしょう。 ただ、最近のPCは、64bitが大半なので、 %4X では桁数が不足してると思いますが、、、(越えていれば、その桁数で表示されるので、実害は無い?)

ちょっと情報が不足しているので、違うかもしれませんが、参考までに。

投稿2019/10/20 03:32

pepperleaf

総合スコア6385

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

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

NT1010

2019/10/20 03:58

ありがとうございます!参考にしてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問