怎么理解 static void * a = &a; ?

怎么理解这行代码?

 static void * a = &a;
 

在AFN的源码上看到的。

static void *AFHTTPRequestSerializerObserverContext = &AFHTTPRequestSerializerObserverContext;

AFURLRequestSerialization.h 文件里面, 在序列化的时候,使用到。
这种风格的代码, 其他地方也看到过几次。

知乎里面有一个同样的问题,

答案是
这是一个静态无类型指针a然后用指针滴地址赋给a就是一个初始化了。也就是一个指向指针滴指针。

我不是很懂,几个回答,我都觉得解释不是很明确。

我在这里再问下。

阅读 6.4k
5 个回答
static void * a = &a;

拆开来看:

  • &a 是一个指向a的指针,是一个内存地址
  • void * 是一个无类型指针,静不静态对解释没有影响,该指针指向a的内存地址

综上就是 指向指针(&a)的指针(void *)

两步
首先声明

static void * a

a是一个指针,指向一个地址,本身也有一个地址

然后

*a = &a

把a所指向的地址指向a指针所指向的地址

这是一种针对无类型(void)指针初始化的方式,把指针的地址赋给指针自己,举例子是这样子的。

#include <stdio.h>

int main(){
  void *a = &a;
  void *b = &b;
  printf("Address of a: %ld\n",(long)a);
  printf("Address of b: %ld\n",(long)b);
  return 0;
}

运行结果是:

 $./a.out 
Address of a: 140721287950392
Address of b: 140721287950400

你肯定知道 void 是无类型的指针, void 和void**可以互转;

你纠结的点应该在左右两边都是a这儿;不考虑语法错误,强行拆开就是下面酱紫的,实际过程就是这样子的:

void* a;
void* a = (void*)&a;

乍看上去是不太好理解。但其实上就是void 和 void* 的转换吧。

新手上路,请多包涵

这样定义的作用是什么?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题