我如何决定是否需要addressof(x)而不是&x在获取对象的地址时?
似乎这个问题令人困惑,所以需要澄清:
addressof显然绕过了重载的地址运算符.我已经意识到了这一点.
我想知道的是:
我怎么知道这是不是我真的想做什么?(特别是在模板内部等)
是否有某种"规则"可以帮助我找出什么时候需要addressof而不是&?
毕竟,他们都返回对象的"地址",那么我什么时候使用哪个?
我正在玩,gcc并尝试了以下一些代码:
int A = 42;
int *B = &A;
int *C = &*B;
Run Code Online (Sandbox Code Playgroud)
并且C == &A,正如所料.但是当我尝试:
int *B = NULL;
int *C = &*B;
Run Code Online (Sandbox Code Playgroud)
原来C == NULL,没有段错误.因此,在获取其地址之前&*B实际上并未解除引用B.
我的猜测是预处理器剥离出来的情况下,&*和*&之前,他们甚至得到了编译器,因为他们否定对方,但我无法找到任何文件,以验证这是否是标准ç或编译器特定的.
被预处理器剥离出来&*,并*&和我可以期待从任何给定的编译器这种行为?
正如在这个问题中所讨论的,GCC定义了非标准的一元运算符&&来获取标签的地址.
为什么它定义一个新的运算符,而不是使用运算符的现有语义&和/或函数的语义(where foo和&fooboth都产生函数的地址foo())?
我有一个超载一元的课程operator&.该类型的对象是使用创建的new,因此变量的地址是可访问的,但现在我需要使用静态对象.有可能得到它的地址吗?
我知道所有关于指针和&符号的意思是"地址",但在这种情况下它意味着什么?
另外,当重载运算符时,为什么通常用const声明参数?
我是入门编程课程的助教,有些学生犯了这种错误:
char name[20];
scanf("%s",&name);
Run Code Online (Sandbox Code Playgroud)
这并不奇怪,因为他们正在学习......令人惊讶的是,除了gcc警告之外,代码也起作用(至少这部分).我一直在努力理解并编写了以下代码:
void foo(int *v1, int *v2) {
if (v1 == v2)
printf("Both pointers are the same\n");
else
printf("They are not the same\n");
}
int main() {
int test[50];
foo(&test, test);
if (&test == test)
printf("Both pointers are the same\n");
else
printf("They are not the same\n");
}
Run Code Online (Sandbox Code Playgroud)
编译和执行:
$ gcc test.c -g
test.c: In function ‘main’:
test.c:12: warning: passing argument 1 of ‘foo’ from incompatible pointer type
test.c:13: warning: comparison of distinct pointer types lacks a cast …Run Code Online (Sandbox Code Playgroud) 以下代码使用gcc 7.2.0和clang 6.0.0编译得很好.
#include <iostream>
struct stru;
void func(stru& s) {
std::cout << &s << std::endl;
}
int main() {
}
Run Code Online (Sandbox Code Playgroud)
我想知道这是怎么回事.如果stru超载operator&()怎么办?编译器不应该只用一个前向声明来表示struct stru.在我看来,只有std::addressof(s)不完整的类型才行.
std::addressofC++ 17 的规范已经改变:现在允许它是一个常量表达式.但是,cppreference说:
表达式
std::addressof(E)是一个常量子表达式,如果E是左值常量子表达式.
std::addressof(E)恒定表达式的例子?std::addressof(E)不是常量表达式的例子?正如标题所说,我总是想知道为什么scanf必须采取address of运算符(&).
我需要将函数的引用传递给VB.NET中的另一个函数.如何才能做到这一点?
我的函数需要在内部使用AddHandler,我需要为它传递一个处理函数.我的代码显然不起作用,但它传达了我需要的想法.
Public Function CreateMenuItem(ByVal Name As String, ByRef Func As AddressOf ) As MenuItem
Dim item As New MenuItem
item.Name = Name
'item. other options
AddHandler item.Click, AddressOf Func
Return item
End Function
Run Code Online (Sandbox Code Playgroud)
还有另一种方法吗?AddHandler需要以某种方式设置为函数中传递的参数...