ポインタとprintf関数についての初歩的な質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
エレジー
記事: 49
登録日時: 13年前

ポインタとprintf関数についての初歩的な質問

#1

投稿記事 by エレジー » 12年前

以前この掲示板でゲームプログラミングについて質問させていただいていた者ですが、長い間挫折していました。
何が原因かと考えたところ、ゲームプログラミング以前にC/C++に関しての知識がしっかりしていないということが分かったので、勉強しなおしています。
これから当面はC/C++に関する超初歩的な質問をさせていただきたいと思いますのでよろしくお願いいたします。

件名と関係のない内容が長くなってしまい申し訳ないです。
ここから質問です。
printf関数の引数に*がつくときとつかないときの違いがよく分かりません。

コード:

	int num = 10;
	int* p = #

	printf( "%d\n", *p );
のようなときには引数に*をつけるのに

コード:

	char *str = "abc";

	printf( "%s\n", str );

	return 0;
のようなときは引数に*をつけません。
上のソースコードで*をつけなければ002DF7F8のようなポインタ自体の値が出力されてしまいます。
下のソースコードのprintf関数の引数のstrは文字列"abc"の先頭のアドレスを指し示すポインタとして扱われるはずなので、どちらのprintf関数の引数もポインタ変数であることは同じなのにつけるつけないの違いがある理由が分かりません。
ポインタについて理解しきれていないのかもしれません。

なんとなくで文字列のときにつけないんだなぁとは分かるのですが、理由を知りたいのでよろしくお願いします。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: ポインタとprintf関数についての初歩的な質問

#2

投稿記事 by beatle » 12年前

%dは対応する引数をint値だと思って出力する書式指定子です
%sは対応する引数を文字列へのアドレスだと思って出力する書式指定子です

関数の引数にint値はそのまま渡せますが、文字列自体をそのまま渡すことはできませんので、仕方なく文字列の先頭がある場所を数値化して渡します。

もし、%dが「対応する引数をint値へのアドレスだと思って出力する書式指定子」だったら、
printf( "%d\n", p );
と、アスタリスクを付けないで渡せば、お望みの整数値「10」を表示することができます。
しかしprintfの仕様はそうではなく、%dは対応する引数をint値そのものだと思って出力する書式指定子ですから、アスタリスクを付けない場合はアドレス値(の整数表現)が表示されます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ポインタとprintf関数についての初歩的な質問

#3

投稿記事 by softya(ソフト屋) » 12年前

C言語において文字列は、char型ポインタで扱うという規格がまずあります。
あとコンパイラとしての現実的な問題として、数値はCPUレジスタに収まるが不定長である文字列はCPUレジスタに収めることが出来ないと言う問題から関数間の受け渡しにはポインタ以外は考えられないと側面があります。
なので、printfの仕様として%s書式は文字列(char型ポインタ)で、それ以外は数値として引数で受け渡しという仕組みになっています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

エレジー
記事: 49
登録日時: 13年前

Re: ポインタとprintf関数についての初歩的な質問

#4

投稿記事 by エレジー » 12年前

%dと%sでそもそも引数にするべきものが違うんですね。

ありがとうございました。
理解できました。

閉鎖

“C言語何でも質問掲示板” へ戻る