我在互联网上阅读不同的东西,感到困惑,因为每个网站都说不同的东西。 谈到C. 我读了关于*引用操作符和& dereferencing操作符; 或者引用意味着使指针指向一个variables,而解除引用是访问指针所指向的variables的值。 所以我感到困惑。 我可以得到一个关于“引用和取消引用”的简单但彻底的解释吗?
我不能想象在函数调用中多个星号的实际使用: void foo(int a, char b) { } int main(void) { (**************foo)(45, 'c'); //or with pointer to function: void (*ptr)(int, char) = foo; (******ptr)(32, 'a'); } 为什么这个东西在C和C ++中都是允许的?
如果我在C ++中有一个指向vector的指针: vector<int>* vecPtr; 而我想访问vector的元素,那么我可以通过去除vector来做到这一点: int a = (*vecPtr)[i]; 但是这个解引用实际上是在栈上创build一个我的向量的副本? 让我们说vector存储10000整数,将通过取消引用vecPtr 10000整数被复制? 谢谢!
我已经看到了很多关于这个问题的问题,但是我会以不同的方式提出问题。 是否有一种方法容易确定是什么导致types不完整? 在我的情况下,我正在使用别人的代码,我完全相信我没有正确的标题,但(因为电脑做这个东西比人眼更快,更好)有没有办法让编译器说,“嘿,你认为你在第34行input了X,但实际上是缺less的 。 错误本身只在您分配时显示,这不是很有帮助。
我不确定这是否是一个适当的编程问题,但这一直是困扰着我的东西,我想知道我是否是唯一的问题。 最初学习C ++时,我理解了引用的概念,但是指针让我感到困惑。 你为什么问? 由于你如何声明一个指针。 考虑以下: void foo(int* bar) { } int main() { int x = 5; int* y = NULL; y = &x; *y = 15; foo(y); } 函数foo(int*)接受一个int指针作为参数。 因为我已经将y为int指针,所以我可以将y传递给foo ,但是当第一次学习C ++时,我将*符号与解引用关联起来,因此我认为需要传递一个取消引用的int 。 我会尝试将*y传递给foo ,这显然不起作用。 拥有一个单独的运算符来声明一个指针会不会更容易? (或取消引用)。 例如: void test(int@ x) { }
有什么办法来检查一个迭代器(无论是从vector,列表,双向…)是(仍然)无法引用,即没有失效? 我一直在使用try – catch ,但有没有更直接的方法来做到这一点? 例子:(不起作用) list<int> l; for (i = 1; i<10; i++) { l.push_back(i * 10); } itd = l.begin(); itd++; if (something) { l.erase(itd); } /* now, in other place.. check if itd points to somewhere meaningful */ if (itd != l.end()) { // blablabla }
点( . )运算符用于访问结构的成员,而C中的箭头运算符( -> )用于访问由所讨论的指针引用的结构的成员。 指针本身没有任何可以用点运算符访问的成员(实际上它只是一个描述虚拟内存中的位置的数字,所以它没有任何成员)。 所以,如果我们只是定义了点运算符,如果指针(编译器在编译时已知的信息)上使用它,就会自动解引用指针。 那么为什么语言创作者决定通过添加这个看似不必要的操作符来使事情更加复杂呢? 什么是大devise决定?
这是我跑的一个程序: #include <stdio.h> int main() { int y = 1234; char *p = &y; int *j = &y; printf("%d " , *p); printf("%d" , *j); } 我对输出有些困惑。 我所看到的是: -46 1234 我作为一个实验写了这个程序,并不知道它会输出什么。 我期待y可能有一个字节。 这里发生了什么“幕后”? 如何解引用p给我-46? 更新 由于指出了其他我必须做明确铸造不会导致UB.I不改变这一行char *p = &y to char *p = (char *)&y以便我不在下面的答案无效。
我正在学习/试验Rust,在我用这种语言发现的所有优雅中,有一个让我感到困惑的特性,似乎完全不合适。 在进行方法调用时,Rust会自动解引用指针。 我做了一些testing,以确定确切的行为: struct X { val: i32 } impl std::ops::Deref for X { type Target = i32; fn deref(&self) -> &i32 { &self.val } } trait M { fn m(self); } impl M for i32 { fn m(self) { println!("i32::m()"); } } impl M for X { fn m(self) { println!("X::m()"); } } impl<'a> […]
请附上解释的例子。