为啥 &vector_char[0] 打印所有字符?

Posted

技术标签:

【中文标题】为啥 &vector_char[0] 打印所有字符?【英文标题】:Why does &vector_char[0] print all characters?为什么 &vector_char[0] 打印所有字符? 【发布时间】:2020-08-02 17:49:37 【问题描述】:

我一直在分析代码,发现了这个:

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

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

【问题讨论】:

您传递的是第一个字符的地址,而不是对它的引用 &amp; 符号在 C++ 中有多种含义。你误会了,在这种情况下,它的意思是reference。不,它的意思是address-of 你希望它打印什么? 【参考方案1】:

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

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

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

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

int main () 
    int i = 3;

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


    return 0;

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

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;

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


那么,为什么这会导致打印所有字符?好吧,你基本上遇到了this problem,只是在你和字符指针之间有几层。正如one of the answers 中提到的,char *s 是一种表示字符串的旧方式。因此,许多函数将char* 视为字符串,而不是单个字符。

那么,您如何从std::vector 获得char *?好吧,只要说您使用&amp; 是不小心这样做就足够了。由于std::vectors have continuous memory,您基本上最终得到了一个有效的char *

【讨论】:

以上是关于为啥 &vector_char[0] 打印所有字符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 write() 不打印数字?

为啥合并打印顺序相反

为啥这个程序打印“fork”! 4次?

为啥在PL/Sql程序运行时打印新旧值。?

为啥我会收到运行时错误?

为啥 5/7 打印 0?