指针指向数组中的下一个元素,但地址是相同的。如何?

时间:2017-03-13 23:31:22

标签: c++ pointers

我在接受采访时被问到这个问题。据我所知,它将字符从a复制到s,直到遇到空字符。所以我相信指针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 个答案:

答案 0 :(得分:1)

  

所以我相信指针a和s指向的地址也会改变。

你的推理是合理的。他们指向的地址确实发生了变化。

  

地址都一样,这是怎么回事?

因为addressof运算符为您提供了存储变量的地址 。由于存储指针的位置不会改变,因此您打印的地址也不会发生变化。

  

当我使用cout在复制完成后输出myfunc中的字符串时,它会显示完整的字符串。为什么会这样?不应该指针指向字符串末尾的位置吗?

myfunc结束时,指针将指向缓冲区之后的一个指针。访问已分配内存之外的内存具有未定义的行为。

答案 1 :(得分:0)

之前的答案是正确的,但另外:

如果你想要打印出s的地址,你真的需要做

cout&lt;&lt; (int)a&lt;&lt;&#; &#34;&LT;&LT; (int)s&lt;&lt;&#; &#34; &LT;&LT; * a&lt;&lt; ENDL;

否则它仍将被解释为字符串 - 而不是地址。

或更好

cout&lt;&lt; std :: hex&lt;&lt; (int)a&lt;&lt;&#; &#34;&LT;&LT; std :: hex&lt;&lt; (int)s&lt;&lt;&#; &#34; &LT;&LT; * a&lt;&lt; ENDL;

回复:

  

当我使用cout在复制完成后输出myfunc中的字符串时,它会显示完整的字符串

你需要明白你的myfunc(char * s,char * a)函数参数是你的&#39; s&#39;和&#39; a&#39;全局静态 - 你正在通过值传递 - 所以即使在myfunc中你正在改变&#39;&#39;和&#39; a&#39;这不会影响&#39;和&#39; a&#39;在&#34;主要范围&#34;。