int main(int argc, char **argv){
int a, b, c;
char str1[4] = "abc";
//printf("%s", str1);
printf("%s", &str1[0]);
return 0;
}
これを実行すると、なぜ
abc
と表示されるのでしょうか。
&(アンド)をつけているのでアドレスが渡されると思うのですが、なぜだか教えてください。
c言語の&(アンド)について。
Re: c言語の&(アンド)について。
コメントアウトした行も実行した行のどちらも
渡しているのはstr1の最初の要素のアドレスです。
文字列を扱う関数には文字列の最初の要素のアドレスを渡しています。
渡しているのはstr1の最初の要素のアドレスです。
文字列を扱う関数には文字列の最初の要素のアドレスを渡しています。
Re: c言語の&(アンド)について。
printfでアドレスを表示したいときは%pを使いますが%dでも問題ないと思います。
Re: c言語の&(アンド)について。
printf()に渡しているのはstr1[0]のアドレスであることは間違いありません。
printf()の第1引数が"%s"ですから、printf()は、渡ってきたアドレスに格納している情報を
文字列であると判断し、'\0'が来るまでひたすら文字列として表示しようとします。
str1[]には
'a', 'b', 'c', '\0'
が入っていますから、結果は
abc
です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: c言語の&(アンド)について。
例えば配列で表現された仮想マシンのメモリのアドレス(int型で表される配列の添字)などは%dを使用するのが適切ですが、Tatu さんが書きました:printfでアドレスを表示したいときは%pを使いますが%dでも問題ないと思います。
C言語のポインタに格納するアドレスは%pを利用しなくてはいけません。
環境によっては、%dでは正しいC言語のポインタに格納するアドレスが出力されません。
#include <stdio.h>
int main(void) {
int a = 123;
void* ptr = (void*)&a;
printf("%d\n", ptr);
printf("%p\n", ptr);
return 0;
}
さらに厳密には、%pで表示するのはvoid*型のデータ(voidを指すポインタ)でないといけませんが、
ポインタなら代表的な環境では問題は起きない気がします。(根拠はありません)
The C89 Draft > 4.9.6.1 The fprintf functionThe conversion specifiers and their meanings are
(中略)
p The argument shall be a pointer to void . The value of the pointer is converted to a sequence of printable characters, in an implementation-defined manner.
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)