2017-08-28 15 views
0

多くの例では、int x = 0; int *ptr; ptr = &xの場合、ptrはxのアドレス情報を保存しています。私はちょっと混乱しています。なぜなら、次のコードが同じように動作するのではないかというと、私はptrを印刷するとき、それは示していますC++ポインタの文字配列の割り当て

アプリ

なく、P [0]のアドレス。

#include <iostream> 
#define show(a)  std::cout<<a<<std::endl; 
#define Syswait  std::system("pause"); 

int main() { 


char p[] = "app"; 
char *ptr; 
ptr = &p[0]; 
show(ptr); 

Syswait; 
} 

誰でも説明できますか?ありがとう。

+0

ptrは最初のアドレス(開始アドレス)を格納します。ptr =&x ..its実際にゼロの最初のアドレスを保存します –

+4

マクロは悪です。使用しないでください。例として、 'show(a&b)'を実行するとどうなりますか? – o11c

+3

[cout <<とchar \ *引数の重複したものは、ポインタ値ではなく文字列を出力します](https://stackoverflow.com/questions/17813423/cout-with-char-argument-prints-string-not-pointer-value ) –

答えて

2

これが関数の宣言であるためです。 ptrchar*(charポインタ)であり、それを受け入れるように特別に定義されたオーバーロードがあります。

std::cout<<a 

actually callsとして宣言された関数:私たちは関数が何をするかを学ぶのリンクから

template< class Traits > 
basic_ostream<char,Traits>& operator<<(basic_ostream<char,Traits>& os, 
             const char* s); 

:歩哨オブジェクトを作成し、チェックした後

から連続 文字を挿入最初の要素が に指されている文字配列。これを避けるために

は、void *にキャスト:

std::cout << (void *)a; 
2

実際にその仕事をしてポインタを。実際にはポインタではありませんが、あなたが観察しなければならないのはそれです。

は、上記のコードcout<<p<<endl; P意志出力に次のコード

#include<iostream> 
using namespace std; 
int main(){ 
Char p[ ] = "app"; 
Cout<<p<<endl; 
Return 0; 
} 

にPの0番目のインデックスのアドレスを考えます。 0番目のインデックスを格納するためにポインタを使用する場合、ポインタは同じです。

Coutはchar変数のポインタをcstringとみなし、配列のすべての文字を出力します。

ポインタを使って同じことをしています。

関連する問題