web-dev-qa-db-ja.com

printf()は配列全体を出力します

Cプログラムに次のコードがあると仮定しましょう。

#include <stdio.h>

void PrintSomeMessage( char *p );

int main(int argc, char *argv[]) {
    char arr[10] = "hello";
    PrintSomeMessage(&arr[0]);
    return 0;   
}

void PrintSomeMessage(char *p)
{
    printf("p: %s",p);
}

なぜこの出力は、単一の文字「h」ではなく、単語全体「hello」になるのでしょうか?

ただし、"%c"フォーマッタでは、1文字だけが印刷されます。それでも、このアドレスの各文字のメモリアドレスは異なります。誰か、私に説明してください?

11

それでも、このアドレスの各文字のメモリアドレスは異なります。

メモリアドレスは異なりますが、文字の配列としてシーケンシャルです。最初の要素のアドレスを渡して%sを使用すると、printfは、'\0'が見つかるまで、指定されたアドレスから始まるすべての文字を出力します。

26
Rohan

arrays の場合、ベースアドレス(つまり、配列のアドレス)は、配列の最初の要素のアドレスです。また、配列名はポインターとして機能します。

家の列を考えます(それぞれが配列の要素です)。行を識別するために必要なのは、最初の家の住所だけです。各家の次(連続)が続きます。最初の家の住所を取得すると、行の住所もわかります。

文字列リテラル(宣言で定義された文字配列)の場合、\0によって自動的に追加されます。

printf 指定された形式指定子とアドレスを使用して印刷します。 %sを使用するため、最初のアドレス(算術を使用してポインターをインクリメント)から '\ 0'まで出力します

5