我在接受采访时被问到这个问题。据我所知,它将字符从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
地址都一样,这是怎么回事?
答案 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;。