2016-05-18 7 views
1

こんにちは、私はプログラミングに慣れていません。 次のコードでstrは文字へのポインタなので、strには文字 'h'のアドレスが含まれているはずです。したがって、そのアドレスを出力するには%pを使用する必要があります。しかし、%sがどのようにポインタパラメータを出力するために使われているのか分かりません。文字列の文字ポインタについての説明

#include<stdio.h> 

    int main(){ 
    char s[] = "hello"; 
    char *str = s; 
    int a[] = {1, 2, 3, 4, 5}; 
    int *b = a; 
    printf("%s\n", str);  // I don't understand how this works ? 
    printf("%c\n", *str);  // This statement makes sense 
    printf("%c\n", *(str + 1)); // This statement also makes sense. 
    printf("%p\n",str);   // This prints the address of the pointer str. This too makes sense. 
    printf("%d\n",*b);   // makes sense, is the same as the second print. 
    //  printf("%d",b);  // I don't understand why str pointer works but this gives a compile error 
    return 0; 
} 
+0

明確ではありませんか?なぜ文字列形式指定子が文字列で動作するのですか?それは働くと定義されているので... –

+0

最初のプリントを理解できません。私は最初のプリントが動作する場合は、コメントの最後のプリントも動作するはずだが、それは本当ではないので、私の質問、ありがとうと思う。 –

+0

なぜ 'printf("%d "、b);'エラーを返すべきではありませんか? –

答えて

4
char s[] = "hello"; 

Sと呼ばれるゼロで終了する文字の配列を宣言します。これは書き込みと同じです

char s[6] = { 'h', 'e', 'l', 'l', 'o', '\0' }; 

ご覧のとおり、引用符は省略記号です。


char *str = s; 

これは、文字へのポインタであることをstrを宣言します。 strsの最初の文字を指します。つまり、strには、最初の文字のアドレスがsに含まれています。


int a[] = {1, 2, 3, 4, 5}; 

整数の配列を宣言します。これらの値を1〜5の値に初期化します。


int *b = a; 

intへのポインタであることを宣言しb。それはの最初のintにbを指し示します。


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

%s指定子は文字列の最初の文字のアドレスを受け入れます。 printfはそのアドレスから歩き、最後に\0文字が表示されるまで表示されている文字を印刷します。


printf("%c\n", *str); 

これはstrの最初の文字を印刷します。 strが文字(文字列の最初の文字)を指しているので、*strは、指し示されている文字(文字列の最初の文字)を取得する必要があります。


printf("%c\n", *(str + 1)); 

これはstrの2番目の文字を印刷します。これは長い道のりを書いてstr[1]です。この背後にあるロジックはポインタ演算です。 strが文字のアドレスである場合、str + 1は配列内の次の文字のアドレスです。 (str + 1)はアドレスなので、逆参照される可能性があります。したがって、*は、文字の1文字を配列の最初の文字よりも先に取得します。


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

%p指定子はちょうど%sたい、ポインタを期待しますが、それは何か他のものを行います。文字列の内容を表示するのではなく、単にポインタが含むアドレスを16進数で表示します。


printf("%d\n",*b); 

これは、配列の最初intbによって指さ印刷します。これは、b[0]と同じです。


printf("%d",b); 

b%dを期待している、int *、ないintです。配列の最初の要素のアドレスを印刷しようとした場合、指定子はであり、%dではありません。また、この行はコンパイラエラーを生成すべきではありません。その代わりに、コンパイラはprintfフォーマット文字列が何であるか分からないため、実行時の未定義の動作であったはずです。

+0

ありがとうございました –

+0

'printf("%c \ n "、* str);'最初に印刷しますキャラクター。 '* str'は' *(str + 0));の単純化された結果です(明らかに '+ 0'は何もしません)。 ' –