1

教科書からこのコードを取得しました:

#include <iostream>
using namespace std;
int main(){
    char str1[]="hello,world!", str2[20], *p1, *p2;
    p1=str1; p2=str2;
    /*
    for(;*p1!='\0';p1++,p2++){
      cout<<"p1="<<*p1<<endl;
      *p2=*p1;cout<<"p2="<<*p2<<endl;
    }
    *p2='\0';
    p1=str1; p2=str2;
    */   
    cout<<"p1="<<p1<<endl;
    cout<< "p2="<<p2<<endl;  

    return 0;
}

このコードを実行すると、p1=hello,world!p2= 理解できる出力が表示されます。

しかし、for ループのコメントを外すと、出力はここで私が混乱したことを示しています。なぜ for ループの後、なぜp1=代わりに が表示され、for ループでの代入の後でもp1=hello,world!for ポインターが表示されるのですか?p2p2=

しかし、この行のコメントを外した後p1=str1; p2=str2;、出力はp1=hello,world!, p2=hello,world!、なぜそのように機能するのですか?

そして、この行を書く理由は何*p2='\0';ですか。この行がコメントアウトされているかどうかは関係ありません。以前の出力は変更されません。

ここのcharポインタがどのように機能しているか誰か教えてもらえますか?

4

4 に答える 4

2

ループはp1、文字列の末尾にあるヌル ターミネータを指すように変更されます。それが空の文字列の定義です。p2同様に、文字列の末尾にあるヌル ターミネータを指します。

リセットして元の値に戻すと、文字列がそのまま表示されますp1p2

于 2013-05-03T04:05:56.603 に答える
1

コードは にコピーstr1するためのものstr2です。

C++ では、'\0'文字列を終了するために使用されます。char ポインター (たとえば ) を出力しようとするとptr、コンパイラーは (ポインターが指す文字) から始まる文字列を出力します*ptr。コンパイラが を見つける'\0'と、印刷を停止します。

最初p1に、 の最初の文字をstr1指しp2、 の最初の文字を指しstr2ます。他に何もせずにそれらを出力すると、コンパイラは両方の文字列を完全に出力します。したがって、出力は になりますp1=hello,world!p2=

for ループはp1、 andp2を介してstr1進みstr2ます。最後に、 の末尾p1にある \0 を指し、 の末尾にあるをstr1指しp2ます。したがって、 for ループが終了した直後にまたはを印刷すると、コンパイラはすぐに印刷を見つけて停止します。したがって、出力が得られます。'\0'str2p1p2'\0'p1=p2=

コメントp1=str1; p2=str2;を解除すると、両方の文字列が再び最初の文字を指すようになるため、ここでそれらを印刷すると文字列全体が印刷されます。したがって、出力が得られますp1=hello,world!p2=hello,world!(forループでstr1コピーされたため)。str2

はで*p2 = '\0'終わるだけです。その行がなくてもコードが機能する場合は、コンパイラが to のすべての文字を自動的に初期化したことを意味します。ただし、コンパイラはそれを行うことが保証されていないため、プログラムでは常に文字列を終了する必要があります。str2'\0'str2'\0''\0'

于 2013-05-03T04:30:34.637 に答える
1

これは、コメントされた部分のコメントを外してそのコードを実行した VS2010 からの出力です。

p1=h
p2=h
p1=e
p2=e
p1=l
p2=l
p1=l
p2=l
p1=o
p2=o
p1=,
p2=,
p1=w
p2=w
p1=o
p2=o
p1=r
p2=r
p1=l
p2=l
p1=d
p2=d
p1=!
p2=!
p1=hello,world!
p2=hello,world!

それは私が期待していたものです!基本的に、このコードは、str1 の各文字を一度に 1 つずつ str2 にコピーすることにより、直接ポインター操作を介して str1 の内容を (初期化されていない) char 配列 str2 にコピーしています。

最後の質問に答えると、その理由は

*p2='\0';

forループによって「作成」されている2番目の文字列が正しくnullで終了するようにするためです。その行がないと、「C」文字列のように扱うことができない char 配列になります。

str2[] のサイズが 20 文字のみと宣言されているため、最初の文字列の長さが 20 文字を超えると機能しなくなるため、全体的にこれはかなり不自然で堅牢でない例です。

于 2013-05-03T04:16:38.253 に答える
0

c++ 文字列は char * であり、内部では p1 と p2 は両方とも同じ文字列を指しています。インクリメントされると、文字列 "*p2='\0';" の文字を通過します。文字列をヌル文字に設定します。これは、後の行でとにかくリセットされるため、プログラムには影響しません。

于 2013-05-03T04:13:16.053 に答える