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

Pointer points to a next element in array, but address is the same. How?

本文关键字:地址 如何 元素 数组 下一个 指针      更新时间:2023-10-16

我在采访中被问到这个问题。我知道它将字符从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

地址都是一样的,如何发生?

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

您的推理是正确的。他们指向的地址

地址都是一样的,如何发生?

因为操作员的地址为您提供了存储变量的地址。由于存储指针的位置不会更改,因此您打印的地址也不会更改。

当我使用COUT完成复制后输出MyFunc中的字符串时,它会显示完整的字符串。为什么会发生?指针不应该指向字符串末端的位置吗?

myfunc的末尾,指针将指向缓冲区的一个。在分配的内存之外访问内存具有未定义的行为。

上一个答案是正确的,但此外:

如果要打印出S和A的地址,则实际上需要做

cout&lt;&lt;(int)a&lt;&lt;"&lt;&lt;(int)s&lt;&lt;"&lt;&lt;*a&lt;&lt;endl;

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

或更好的仍然

cout&lt;&lt;std :: hex&lt;&lt;(int)a&lt;&lt;"&lt;&lt;std :: hex&lt;&lt;(int)s&lt;&lt;"&lt;&lt;*a&lt;&lt;endl;

回复:

当我使用Cout完成复制后输出MyFunc的字符串时,它将显示完整的字符串

您需要了解您的myfunc(char* s,char* a)函数参数与您的's'和a a'全局静态不同是不同的变量 - 并且您正在通过value - 通过 - 因此,即使在MyFunc中,您也在更改" S"answers" A",它不会影响" S"answers" A"。