c言語の&(アンド)について。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
cc

c言語の&(アンド)について。

#1

投稿記事 by cc » 9年前

int main(int argc, char **argv){
int a, b, c;

char str1[4] = "abc";
//printf("%s", str1);
printf("%s", &str1[0]);
return 0;
}

これを実行すると、なぜ
abc
と表示されるのでしょうか。
&(アンド)をつけているのでアドレスが渡されると思うのですが、なぜだか教えてください。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: c言語の&(アンド)について。

#2

投稿記事 by Tatu » 9年前

コメントアウトした行も実行した行のどちらも
渡しているのはstr1の最初の要素のアドレスです。

文字列を扱う関数には文字列の最初の要素のアドレスを渡しています。

cc

Re: c言語の&(アンド)について。

#3

投稿記事 by cc » 9年前

返答ありがとうございます。

では、アドレスをprintf();にかけたい時は%dを使うということであってますか?

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: c言語の&(アンド)について。

#4

投稿記事 by Tatu » 9年前

printfでアドレスを表示したいときは%pを使いますが%dでも問題ないと思います。

box
記事: 2002
登録日時: 13年前

Re: c言語の&(アンド)について。

#5

投稿記事 by box » 9年前

cc さんが書きました:

コード:

	printf("%s", &str1[0]);
これを実行すると、なぜ
abc
と表示されるのでしょうか。
&(アンド)をつけているのでアドレスが渡されると思うのですが、なぜだか教えてください。
printf()に渡しているのはstr1[0]のアドレスであることは間違いありません。
printf()の第1引数が"%s"ですから、printf()は、渡ってきたアドレスに格納している情報を
文字列であると判断し、'\0'が来るまでひたすら文字列として表示しようとします。
str1[]には
'a', 'b', 'c', '\0'
が入っていますから、結果は
abc
です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: c言語の&(アンド)について。

#6

投稿記事 by みけCAT » 9年前

Tatu さんが書きました:printfでアドレスを表示したいときは%pを使いますが%dでも問題ないと思います。
例えば配列で表現された仮想マシンのメモリのアドレス(int型で表される配列の添字)などは%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;
}
http://melpon.org/wandbox/permlink/D7o736Y4yNq7onuH

さらに厳密には、%pで表示するのはvoid*型のデータ(voidを指すポインタ)でないといけませんが、
ポインタなら代表的な環境では問題は起きない気がします。(根拠はありません)
The 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.
The C89 Draft > 4.9.6.1 The fprintf function
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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