`

关于 void指针(void *)

阅读更多

 

先介绍下void指针:

 

其中的第三个参数类型为void指针.我们知道一个指针有两个属性:指向变量或对象的"地址"和"长度".但是指针只存储"地址".

长度则取决于指针的类型.编辑器根据指针的类型从指针的"地址"向后寻址,指针不同,则寻址范围也不同.比如:

int * 从指定地址向后寻址4个字节作为变量的存储单元; double * 则从指定的地址向后寻址8个字节作为变量的存储单元.

 

1.void指针是特别的指针,因为它没有类型,也就是我们不知道其长度.

    void *vp;

2.任何指针都可以赋值给void指针.

     type *tp;

     vp = tp;//不需要转换.

                 //只获得tp的地址.

3.void指针转赋值给其他类型的指针时需要转换.

    type *tp = (type *)vp;//这样便获得了地址和长度.

4.void指针不能复引用,因为void指针并不知道指针的长度.

    *vp;//错误的

5.void指针不能参加指针运算,除非先对其进行转换.

 

参考:http://www.cppblog.com/dragon/archive/2008/09/02/60760.aspx

---------------------------------------------------------------------------------------------------------------------

 

下面我们在来看看cocos2d中的:

CCCallFuncND *callFun = [CCCallFuncND actionWithTarget:(id) selector:(SEL) data:(void *)];

 

我们可以看到第三个参数的类型是void指针.

对于obj-c的对象指针来说,可以直接将其作为参数传给data.我们前面的2中说了,任何指针都可以赋值给void指针,但是要注意,丢了类型.

 

例子1:

NSString *str = @"hello world";

CCCallFuncND *ac =

[CCCallFuncND actionWithTarget:self selector:@selector(move:data:) data:tempString ];

 

- (void)move(id)sender data:(void *)data {

      NSString *str = (NSString *)data;// 我们可以将void指针转换为NSString.

}

 

 

例子2:

int t = 100;

CCCallFuncND *ac =

[CCCallFuncND actionWithTarget:self selector:@selector(move:data:) data:(void *)t ];//这里不加一个转换xcode会给出警告.

 

- (void)move(id)sender data:(void *)data {

      int t = (int)data;//如果不转换xcode会给出警告.

}

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics