取消引用Objective-C中的指针

Vla*_*tov 9 pointers objective-c

当我们真正想要从这个实例而不是地址获取数据时,任何人都可以解释为什么我们不会将"现在"的指针解除引用到NSDate实例.

NSDate *now = [NSDate date];
NSLog(@"The date is %@", now);
Run Code Online (Sandbox Code Playgroud)

令我感到困惑的是,NSLogAaron Hillegass"Objective-C Programming"一书中使用的前一个例子是:

NSDate *now = [NSDate date];
NSLog(@"The new date lives at %p", now);
Run Code Online (Sandbox Code Playgroud)

这段代码很清楚.我们想要地址,我们得到它.但是,当我们继续使用指针时,如何通过更改说明符来获取实际日期?

小智 8

调用的变量now包含对内存位置的引用.要取消引用指针,必须像在C中一样使用*.

%@是用于打印对象的格式说明符description(由其description方法返回的字符串).

int a = 1;
int *b = &a;  // a pointer
int c = *b;   // here you dereference b
Run Code Online (Sandbox Code Playgroud)


ben*_*ado 8

"实际日期"是一个概念."数据"是一系列字节.它们不是同一件事.

如果您使用的是老式的C风格字符串和printf,您可以这样写:

char *name = "Zakatov";
printf("My name is %s", name);
Run Code Online (Sandbox Code Playgroud)

这是因为printf函数需要使用它的地址.您没有传递"实际数据"而是传递地址,因为传递地址更有效率.将某些内容传递给函数意味着将其值复制到内存的堆栈区域,复制地址(32位或64位)比复制整个字符串(几个字节,或KB或MB)更快.

所以在Objective-C中我们一直处理指向对象的指针,因为指针是引用它们的最简单方法.唯一需要取消引用指针(查看字节)的是运行时系统,例如,当它将消息选择器转换为函数地址以执行它们时.您的代码只是将指针视为指针,并将其传递而不必担心另一端数据的精确布局(字节).