12

私の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」という単語全体になるのはなぜですか?

ただし、フォーマッタに a を入れると"%c"、1 文字だけが出力されることは理解しています。それでも、このアドレスの各文字のメモリ アドレスは異なります。誰か説明してくれませんか?

4

2 に答える 2

5

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

一列に並んだ家を考えてみましょう (それぞれが配列の要素です)。行を特定するには、最初の家の住所だけが必要です。各家の後に次の (連続した) 住宅が続くことがわかります。最初の家の住所を取得すると、行の住所も得られます。

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

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

于 2013-06-06T12:44:02.013 に答える