2016-03-25 26 views
-6
char name[]="samina",*p=name; 
while (*p) 
    cout<<*p++; 
cout<<endl<<p-name; 

私は文字列nameとポインタpを持っています。 whileループは、文字列の各文字へのポインタを更新し、その文字列を表示します。C++:文字列へのポインタ

ただし、式p-nameは常に文字列の長さを表示します。私によれば、ループの末尾でp'\0'を指し、名前のポイントは 's'なので、出力は文字 's'のASCIIコードを与えるべきではないでしょうか?

+0

なぜ 's 'のasciiコードを与えるのだろうか? – wRAR

+0

ASCIIコードの場合は、 'name [0] -p [0]' –

+0

を使用してください。 –

答えて

1

ポインタPは、アドレスなしの値で初期化することはできません(ポインタをアドレスで初期化する必要があります)。

のchar * p = &名[0]

+1

いいえ、あなたは私の質問を理解できませんでした。私はp-nameが何をしているのか知りたい。そして、btw char * p = nameは完璧にうまくいきます! –

+0

ああ、申し訳ありませんが、私はあなたに完全に質問してください。実際に私はちょうどp - 名前が何をしているのか分からない! –

0

はのはnameを言ってみましょうそれを0x10回を増加させた後0x20304060addressにしばらくpポイント、0x20304050のアドレスに格納されています。

p address- name address = 0x10だからこそ、その結果が得られます。

はおそらく、これはヨーヨーではなく欲しいものである:C++標準に従って

cout << (*p) /*0*/ - (*name) /*115*/; // = -115 
0

(5.7添加オペレータ)

同じ配列オブジェクトの要素への2つのポインタが が減算さ

6、結果は2つの配列要素の下付き文字の違いになります。結果の型は実装定義の 符号付き整数型です。このタイプは、ヘッダ内のstd :: ptrdiff_tとして と定義されているものと同じタイプでなければならない(18.2)。他の 算術オーバーフローの場合と同様に、結果が指定されたスペースに収まらない場合は、 の動作は未定義です。 つまり、式Pと Qがそれぞれ配列 オブジェクトのi番目とj番目の要素を指している場合、式(P) - (Q)は値i - j 値は、タイプstd :: ptrdiff_tのオブジェクトに収まります。さらに、 式Pが配列オブジェクトの1つの要素または配列オブジェクトの最後の要素を指す を指し、式Qが同じ配列オブジェクトの最後の要素を指す場合は ((Q )+1) - (P)は、((Q) - (P))+1と同じ値を持ち、 - ((P) - ((Q)+1))、 であり、 Pは式(Q)+1が が配列オブジェクトの要素を指していないにもかかわらず、配列オブジェクトの最後の 要素を1つポイントします。両方のポインタが同じ配列オブジェクトの 要素、または 配列オブジェクトの最後の要素を指すポインタを指していない限り、その動作は未定義です。

ループ式の後のコードスニペットp - nameには、最初の文字とゼロ文字の間の配列の要素数が含まれています。あなたは各オペランドを使用すると、文字当初's'

0

のコードに対応する整数vakueに等しい's' - '\0'を持っていた、この場合にはタイプcharのある表現*name - *pを使用する場合は

、pは全体を指しています文字列(実際には文字列の先頭まで)は、宣言したとおり、nameと同じ値になります。一方を他方から減算すると、そのアドレスが減算されます。最後に、pが文字列の終わりを指しているが、名前がまだその先頭を指しているので、p-name = 6となる。