为何在循环指针时不产生内存地址?

时间:2017-01-25 23:26:03

标签: c++

当我们打印ptr时,它会给出一个内存地址,但是当我们遍历它时,我们会得到数组元素。是什么造成了差异&为什么呢?

int main()
{
    string texts[] = { "one", "two", "three" };
    string* ptr = texts;

    for (int i = 0; i < 3; i++) {
        cout << ptr[i];
    }
    _getch();
    return 0;
}

4 个答案:

答案 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所说。这个问题是缺乏理解变量内存分配如何工作的结果。请查看更完整的答案。