鍍金池/ 問(wèn)答/C  C++  網(wǎng)絡(luò)安全/ 怎么理解 static void * a = &a; ?

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

怎么理解這行代碼?

 static void * a = &a;
 

在AFN的源碼上看到的。

static void *AFHTTPRequestSerializerObserverContext = &AFHTTPRequestSerializerObserverContext;

AFURLRequestSerialization.h 文件里面, 在序列化的時(shí)候,使用到。
這種風(fēng)格的代碼, 其他地方也看到過(guò)幾次。

知乎里面有一個(gè)同樣的問(wèn)題,

答案是
這是一個(gè)靜態(tài)無(wú)類型指針a然后用指針滴地址賦給a就是一個(gè)初始化了。也就是一個(gè)指向指針滴指針。

我不是很懂,幾個(gè)回答,我都覺(jué)得解釋不是很明確。

我在這里再問(wèn)下。

回答
編輯回答
厭遇

兩步
首先聲明

static void * a

a是一個(gè)指針,指向一個(gè)地址,本身也有一個(gè)地址

然后

*a = &a

把a(bǔ)所指向的地址指向a指針?biāo)赶虻牡刂?/p>

2017年4月5日 00:36
編輯回答
萌吟

你肯定知道 void 是無(wú)類型的指針, void 和void**可以互轉(zhuǎn);

你糾結(jié)的點(diǎn)應(yīng)該在左右兩邊都是a這兒;不考慮語(yǔ)法錯(cuò)誤,強(qiáng)行拆開就是下面醬紫的,實(shí)際過(guò)程就是這樣子的:

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

乍看上去是不太好理解。但其實(shí)上就是void 和 void* 的轉(zhuǎn)換吧。

2017年9月15日 09:50
編輯回答
巫婆

這是一種針對(duì)無(wú)類型(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;
}

運(yùn)行結(jié)果是:

 $./a.out 
Address of a: 140721287950392
Address of b: 140721287950400
2018年4月30日 15:23
編輯回答
薄荷綠

這樣定義的作用是什么?

2017年10月25日 15:56
編輯回答
夏夕
static void * a = &a;

拆開來(lái)看:

  • &a 是一個(gè)指向a的指針,是一個(gè)內(nèi)存地址
  • void * 是一個(gè)無(wú)類型指針,靜不靜態(tài)對(duì)解釋沒(méi)有影響,該指針指向a的內(nèi)存地址

綜上就是 指向指針(&a)的指針(void *)

2017年2月17日 20:17