2

ポインタを理解するのに助けが必要です:

基本的なポインタ:

int i = 3;           
cout << i << endl;   //prints 3
cout << &i << endl;  //prints address of i

int * p = &i;
cout << p << endl;   //prints the address p points to
cout << &p << endl;  //prints the address of p
cout << *p << endl;  //prints the value stored at the address p points to

今混乱:

char *buf = "12345"; 
cout << &buf[2] << endl;  //prints 345
cout << buf+2 << endl;    //prints 345
cout << *buf << endl;     //prints 1
cout << *(buf+2) << endl; //prints 3
cout << buf << endl;      //prints 12345
cout << &buf << endl;     //prints 001CFA6C

buf [3]のアドレスを印刷するにはどうすればよいですか?

4

3 に答える 3

3

charポインタは、歴史的にCで文字列として使用されてきたという意味でやや特殊です。C++はほとんどCと下位互換性があるため、C文字列をサポートしています。したがってchar、アドレスを出力するのではなく、ポインタを出力すると、Cの場合と同様に、NULL文字に達するまで文字列内の各文字が出力されます。

実際のアドレスを出力するには、ポインタをにキャストしますvoid*

cout << static_cast<void*>(&buf[3]) << endl;

于 2012-09-02T23:50:17.430 に答える
1

iostreamには、charポインター用の特別なオーバーロードがあります(nullで終了する配列へのポインターとして扱い、配列全体を出力します)。ポインタを数値として出力されるvoidポインタに変換して、オーバーロードをバイパスします。

std::cout << static_cast<void*>(buf + 3) << std::endl;
于 2012-09-02T23:49:44.983 に答える
1

あなたの問題は、を使用してポインタを理解しようとすることですchar。ただし、char特別です。特にchar const*、他のポインタのようには扱われませんが、C文字列のように扱われます。これは&buf[2]確かに3番目の文字のアドレスですが、このアドレスはnullで終了する文字シーケンスの開始と見なされ、このポインターを印刷してもポインターは印刷されず、このアドレスで始まる文字列が印刷されます。intこの相互作用を避けるために、sでも同じことを試してください。

于 2012-09-02T23:50:12.823 に答える