2017-03-13 10 views
-1

私はインタビューでこの質問をしました。私はそれがヌル文字に遭遇するまで、文字を〜からコピーしていることを理解しています。だから、ポインタaとポインタsによって指されるアドレスも変わると私は信じていました。ポインタは配列内の次の要素を指しますが、アドレスは同じです。どうやって?

#include <iostream> 
using namespace std; 
static char s[15]; 
static char a[] = "giviwfovnsn212"; 

void myfunc(char*s, char*a){ 
    while(*s++=*a++){ 
    cout<<&a<<" "<<&s<<" "<<*a<<endl; 
    } 
    return; 
} 


int main() { 
    myfunc(s,a); 
    cout<<a<<" "<<s; 
    return 0; 
} 

しかし、私は次のような出力が得られます。

0xbf85b7d4 0xbf85b7d0 i 
0xbf85b7d4 0xbf85b7d0 v 
0xbf85b7d4 0xbf85b7d0 i 
0xbf85b7d4 0xbf85b7d0 w 
0xbf85b7d4 0xbf85b7d0 f 
0xbf85b7d4 0xbf85b7d0 o 
0xbf85b7d4 0xbf85b7d0 v 
0xbf85b7d4 0xbf85b7d0 n 
0xbf85b7d4 0xbf85b7d0 s 
0xbf85b7d4 0xbf85b7d0 n 
0xbf85b7d4 0xbf85b7d0 2 
0xbf85b7d4 0xbf85b7d0 1 
0xbf85b7d4 0xbf85b7d0 2 
0xbf85b7d4 0xbf85b7d0 
giviwfovnsn212 giviwfovnsn212 

アドレスがあることが起こっているか、すべて同じですか?

+2

'&a'と'&s'はアドレスのアドレスです。 'cout'行の両方で'& 'を削除してください。 –

+1

あなたは何かをやっている*方法*あまりにもハード。単純なものを試してみましょう: 'void f(int n){++ n; } int main(){int a = 0; f(a); } 'あなたが最初にそれを理解していることを確認してください。 –

+0

私は&aと&sで間違いを起こします。コピーが完了すると、ポインターは文字列の最後を指しています。ありがとう –

答えて

1

私は、ポインタaとポインタsが指すアドレスも変わると考えました。

あなたの推論は音です。彼らがを指すのアドレスは変更されます。

アドレスはすべて同じで、どのように起こっていますか?

AddressOf演算子を使用すると、変数が格納されているアドレスを与えるので。ポインターが格納されている場所は変更されないため、印刷するアドレスも変更されません。

コピーが完了した後にmyfuncで文字列を出力するには、完全な文字列が表示されます。なぜそれが起こるのですか?ポインタが文字列の最後にある場所を指してはいけませんか?

myfuncの末尾にポインタが1つ先にバッファを指します。割り当てられたメモリの外部にあるメモリにアクセスすると、未定義の動作が発生します。

+0

私はコピーが完了した後にmyfuncで文字列を出力するためにcoutを使うと、完全な文字列を表示します。なぜそれが起こるのですか?ポインタが文字列の最後にある場所を指してはいけませんか? –

+0

@RohanAminポインタは必要ですが、ポインタのアドレスは変更されません。 –

+0

@RohanAmin私の編集を参照してください。 – user2079303

0

前の答えは正しいのですが、加えて:

あなたはSのアドレスを印刷したい場合は、あなたが実際に

coutの< <(int型)< <を行う必要があります"" < <(int)s < < "" < < * a < < endl;

それ以外の場合でも、アドレスではなく文字列として解釈されます。

またはより良いまだ

coutの< <のstd ::進< <(int型)< < "" < <のstd ::進< <(int型)■< < "" < < * < < endl;返信で

コピーが行われた後、私は出力にmyfunc関数内の文字列をCOUTを使用する場合、それはあなたがあなたのmyfunc関数(CHARことを理解する必要があり、完全な文字列

を表示* s、char * a)関数のパラメータは、あなたの 's'と 'a'のグローバル統計とは異なる変数です - そしてによってを渡しています - myfuncでは 's'と 'a'それは "s"には影響せず、 "a"は "main scope"に影響を与えます。

関連する問題