标签: addressof

何时使用addressof(x)而不是&x?

我如何决定是否需要addressof(x)而不是&x在获取对象的地址时?


似乎这个问题令人困惑,所以需要澄清:

addressof显然绕过了重载的地址运算符.我已经意识到了这一点.

我想知道的是:
我怎么知道这是不是我真的想做什么?(特别是在模板内部等)

是否有某种"规则"可以帮助我找出什么时候需要addressof而不是&
毕竟,他们都返回对象的"地址",那么我什么时候使用哪个?

c++ addressof

60
推荐指数
5
解决办法
7324
查看次数

C预处理器是否删除了"&*"的实例?

我正在玩,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.

我的猜测是预处理器剥离出来的情况下,&**&之前,他们甚至得到了编译器,因为他们否定对方,但我无法找到任何文件,以验证这是否是标准ç或编译器特定的.

被预处理器剥离出来&*,并*&和我可以期待从任何给定的编译器这种行为?

c standards addressof indirection c-preprocessor

25
推荐指数
2
解决办法
1208
查看次数

为什么GCC定义一元运算符'&&'而不是仅使用'&'?

正如在这个问题中所讨论的,GCC定义了非标准的一元运算符&&来获取标签的地址.

为什么它定义一个新的运算符,而不是使用运算符的现有语义&和/或函数的语义(where foo&fooboth都产生函数的地址foo())?

c gcc addressof unary-operator

24
推荐指数
2
解决办法
2509
查看次数

c ++获取变量的地址而不使用运算符&

我有一个超载一元的课程operator&.该类型的对象是使用创建的new,因此变量的地址是可访问的,但现在我需要使用静态对象.有可能得到它的地址吗?

c++ memory memory-management addressof

23
推荐指数
2
解决办法
4199
查看次数

什么是在类名后使用的&符号,如ostream&operator <<(...)?

我知道所有关于指针和&符号的意思是"地址",但在这种情况下它意味着什么?

另外,当重载运算符时,为什么通常用const声明参数?

c++ pointers class operator-overloading addressof

21
推荐指数
2
解决办法
3万
查看次数

"地址"(&)被忽略的数组/地址是gcc吗?

我是入门编程课程的助教,有些学生犯了这种错误:

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)

c gcc pointers addressof

15
推荐指数
3
解决办法
1789
查看次数

为什么一元运算符并不需要完整的类型?

以下代码使用gcc 7.2.0clang 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)不完整的类型才行.

c++ operator-overloading addressof incomplete-type c++11

12
推荐指数
1
解决办法
721
查看次数

std :: addressof作为C++中的常量表达式17

std::addressofC++ 17 的规范已经改变:现在允许它是一个常量表达式.但是,cppreference说:

表达式std::addressof(E)是一个常量子表达式,如果E是左值常量子表达式.

  • 什么是常量子表达式?
  • 什么是std::addressof(E)恒定表达式的例子?
  • 什么是std::addressof(E)不是常量表达式的例子?

c++ memory addressof constexpr c++17

10
推荐指数
1
解决办法
337
查看次数

为什么scanf必须采用运算符的地址

正如标题所说,我总是想知道为什么scanf必须采取address of运算符(&).

c scanf addressof

9
推荐指数
3
解决办法
7291
查看次数

将AddressOf传递给VB.NET中的函数以使用AddHandler

我需要将函数的引用传递给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需要以某种方式设置为函数中传递的参数...

.net vb.net addressof addhandler

9
推荐指数
3
解决办法
3万
查看次数