我对CS有这个问题。我使用代码p3 = &s1[3];
但是当我在p3
时,它会显示值而不是地址。这是预期的,问题是对的还是我做错了什么?
鉴于以下声明:
int i = 3, j, *p1 = &i, *p2; char s1[20] = "Wow, more pointers!", *p3;
编写使
p3
等于第四个地址的语句s1
的元素。
答案 0 :(得分:4)
流的<<
运算符有几个重载。其中一个需要char*
,并打印一个字符串(从该地址开始的一系列字符,直到下一个0)。另一个采用void*
(指向任何东西的指针),并打印它指向的地址。
如果你自己将指针强制转换为void*
,它将强制编译器选择打印地址的void*
重载:
cout << (void*)p3;
您的指针分配没有错;问题出在你打印时。
答案 1 :(得分:2)
这就是std :: cout如何对待(char *)。这个question包含全面的答案。
答案 2 :(得分:0)
通过分配给*p3
您没有修改指针p3
,您正在修改它指向的内存。要修改指针p3
本身,只需指定p3
。
答案 3 :(得分:0)
作业要求您使&#34; p3
等于s1
&#34;的第四个元素的地址,但您要将地址分配给 *p3
,而不是p3
。
*p3
是p3
指向的内容。 p3
是地址。
顺便说一下*p3 = &s1[3];
shouldn't even compile。如果是,请启用编译器警告和错误。
答案 4 :(得分:-1)
TVJS
因为元素位于s1 + 0,s1 + 1,s1 + 2,s1 + 3,...
请注意,这完全等同于:
p3 = s1+3;
...而且一些对指针算法感到不舒服的人可能更喜欢这样。我个人更喜欢我给的第一个版本。