在C ++中,我总是学会使用地址和解引用运算符,如下所示:
char s = 's';
char *t = &s;
t = 't'; // would be a compile error, because t must first be dereferenced
*t = 't'; // this works
那为什么会这样呢?
map<string, vector<char>> letters = {
{"first", {'a', 'b', 'c'}},
{"middle", {'l', 'm', 'n'}},
{"last", {'x', 'y', 'z'}}
};
vector<char> section = letters.at("first");
我的理解是.at()
返回对指定键处的映射元素的引用。为什么最后一行不能这样:
vector<char> *section = letters.at("first"); // this doesn't work!
然后,我可以继续使用section
,使用.
运算符而不是->
运算符访问其方法,即使根据cplusplus.com它返回一个参考:
char first_letter = section.at(0); // not section->at(0);
这里发生了什么?我实际上是在vector
内获得对map
的引用吗?如果是这样,为什么我不需要使用箭头操作符取消引用返回的元素变量,以便可以调用其方法?
答案 0 :(得分:4)
在C ++中,简而言之,引用是对象的别名,与指针不同。
通过取消引用指针,您可以访问指向对象(或引用)。
使用引用,您可以使用.
运算符访问成员,并使用指针使用->
运算符。
map<string, vector<char>>::at()
返回vector<char> &
(一个引用,实际上它将程序员视为一个实际对象,即好像它是vector<char>
)。那不是vector<char> *
(指向vector<char>
对象的指针)。
答案 1 :(得分:3)
您对引用和指针感到困惑。 “解除引用”这个词的常见用法是&#39; dereference&#39;对你来说也没有帮助,因为你实际上不需要取消引用引用。 - (
您可以将引用视为指针,但添加了语法糖,隐藏了它的基础表示。
因此,如果您有int &iref = i;
之类的引用,就可以像iref
一样使用i
。
iref = 42;
iref += 100;
但是,如果你有一个指针,你必须使用解除引用运算符*
。
*iref = 42;
*iref += 100;
答案 2 :(得分:2)
at()
返回引用,而不是指针:
vector<char> §ion = letters.at("first");
char first_letter = section.at(0);
您不能指定对指针的引用,但您可以在引用上使用&
地址运算符来获取指向所引用项目的指针:
vector<char> *section = &(letters.at("first"));
char first_letter = section->at(0);