首页 > 解决方案 > 为什么 &vector_char[0] 打印所有字符?

问题描述

我一直在分析代码,我遇到了这个:

...
vector <char> buffer (size + 1);
vsnprintf (& buffer [0], buffer.size (), format, args);
printf (& buffer [0]);
...

所以我想知道为什么它会打印所有字符,并且在 vnsprintft 函数中,传递了对向量第一个元素的引用

标签: c++

解决方案


因此,正如其他人所提到的,这是因为您实际上并没有通过引用传递,而是实际上传递了地址。这是因为&在不同的语境中有不同的含义。

在函数声明上下文中,它意味着通过引用传递:

void myFunc(int& i) { // << pass by reference
    std::cout << i;
}

当你调用这样的函数时,你不需要&

int main () {
    int i = 3;

    myFunc(i); // << still passing by reference even though you aren't using the & here


    return 0;
}

另一方面,在调用&函数时使用 an意味着获取该变量的地址。就像这样做:

int main () {
    int i = 3;
    int * ptr = &i; // gets the address of i


    return 0;
}

在这里,我们得到一个指向 的指针i,而不是对它的引用。

函数也是一样的。这是一个函数示例:

void myFunc(int* i) { // << passing the address of a variable
    if(i != nullptr) {
        std::cout << *i;
    }
}
int main () {
    int i = 3;

    myFunc(&i); // << Now we're passing the address of i


    return 0;
}

这是正在发生的事情的第一部分。


那么,为什么这会导致打印所有字符呢?好吧,你基本上遇到了这个问题,你和字符指针之间只有几层。如其中一个答案中所述char *s 是表示字符串的一种旧方式。因此,许多函数将char*其视为字符串,而不是单个字符。

那么,您如何char *从a 中获得 a std::vector?好吧,只要说你是通过使用&. 由于std::vectors 具有连续记忆,因此您基本上以有效的char *.


推荐阅读