当我们打印ptr
时,它会给出一个内存地址,但是当我们遍历它时,我们会得到数组元素。是什么造成了差异&为什么呢?
int main()
{
string texts[] = { "one", "two", "three" };
string* ptr = texts;
for (int i = 0; i < 3; i++) {
cout << ptr[i];
}
_getch();
return 0;
}
答案 0 :(得分:0)
当我们打印ptr时,它会给出一个内存地址,但是当我们遍历它时,我们会得到数组元素。
ptr[i]
是一个指针,因此当你打印它时,你会得到一个内存地址。
注意*(ptr + i)
与ptr[i]
相同。因此,当您使用数组语法$(".product-search-trigger").popover({
trigger: "hover",
container: "body",
html: true,
placement: "left"
}).on("show.bs.popover", function() {
return $(this).data("bs.popover").tip().css({
maxWidth: "300px"
});
});
});
进行循环时,您将取消引用它,因此您可以自行获取数据。
答案 1 :(得分:0)
当你写string* ptr= texts;
时,数组的起始地址存储在指针存储器中,即指针现在指向数组的起始地址。因此,只要您打印ptr
,就会打印一个地址。
但是当你循环它时,ptr[I]
它被评估为*(ptr+i)
。 *是解引用运算符,这意味着它给出了存储在给定地址的值。因此,*(ptr+i)
变为the_value_at(保存在ptr + i中的位置更多单位)。这就是你得到数组值的原因。
答案 2 :(得分:0)
ptr
的类型是string*
- 指向字符串的指针。 ptr[i]
的类型为string
。
cout
是类ostream
的全局实例。此类定义了一个插入运算符,即operator<<()
个string
对象,它们专门打印字符串的内容。因此cout << ptr[i]
打印文本。另一方面,ostream
没有专门为字符串指针定义插入运算符。所以最接近的匹配定义是operator<<(void*)
- 一般指针的插入运算符。这只是打印地址。
答案 3 :(得分:0)
ptr [i]与*(ptr + i)相同。
像字符串或数组这样的容器对象是指向该容器中第一个元素的指针。 []运算符根据起始位置访问某个对象,如@artm所说。这个问题是缺乏理解变量内存分配如何工作的结果。请查看更完整的答案。