为啥 &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 函数中,传递了对向量第一个元素的引用
【问题讨论】:
您传递的是第一个字符的地址,而不是对它的引用。&
符号在 C++ 中有多种含义。你误会了,在这种情况下,它的意思是reference。不,它的意思是address-of。
你希望它打印什么?
【参考方案1】:
因此,正如其他人所提到的,这是因为您实际上并没有通过引用传递,而是实际上传递了地址。这是因为&
在不同的上下文中具有不同的含义。
在函数声明上下文中,这意味着通过引用传递:
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;
另一方面,当您调用函数时使用&
意味着获取该变量的地址。就像这样做:
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 *
?好吧,只要说您使用&
是不小心这样做就足够了。由于std::vector
s have continuous memory,您基本上最终得到了一个有效的char *
。
【讨论】:
以上是关于为啥 &vector_char[0] 打印所有字符?的主要内容,如果未能解决你的问题,请参考以下文章