如果 x 是一个指针,&x 与 x 有何不同?

How does &x vary from x if x is a pointer?

本文关键字:何不同 指针 一个 如果      更新时间:2023-10-16

所以。。。我有以下代码:

int main(void)
{
const char *s="hello, world";
cout<<&s[7]<<endl;
return 0;
}

它打印"世界"。。。但是我不明白为什么:

int main(void)
{
const char *s="hello, world";
cout<<s[7]<<endl;
return 0;
}

只会打印"w"(我所更改的只是去掉了和号),但我以为那是"地址"运算符。。。这让我想知道你为什么需要它,它的功能是什么?

s[7]是字符'w',因此&s[7]成为字符'w'地址。当您将char*类型的地址传递给cout时,它会打印从该字符开始到字符串末尾的空字符的所有字符,即从'w'开始继续打印字符,直到找到。这就是world的打印方式。

是这样的

const char *s="hello, world";
const char  *pchar = &s[7]; //initialize pchar with the address of `w`
cout<< pchar <<endl; //prints all chars till it finds `` 

输出:

world

然而,如果你想打印s[7]的地址,即&s[7]的值,那么你必须这样做:

cout << ((void*)&s[7]) << endl; //it prints the address of s[7]

现在我们传递一个void*类型的地址,所以cout将无法推断它过去用char*类型的地址推断的内容。void*隐藏所有关于地址的内容的信息。因此cout只是打印地址本身。毕竟,这才是它最大的收获。

在线演示:http://www.ideone.com/BMhFy

您的标题与您的问题不匹配。。。完全

由于s是一个指向字符(也称为C样式字符串)的指针,因此s[7]是一个字符。由于s[7]是一个字符,&s[7]是一个指向字符的指针(也称为C样式字符串)。

s[7]是一个字符。(您可以对指向数组的指针进行索引,就好像它只是数组的名称一样)。

&s[7]是指向索引7处的字符的指针。它的类型是char*,因此流插入器将其视为char*。