oc中对指针、对象和%@符号的理解

1.我们知道c语言中对于指针的操作是可以直接通过打印指针而得到对象的地址的,如下:

char *s = "abc";
printf("s的值:%s",s);
printf("s的地址:%p",s);

打印结果为:

s的值:abc
s的地址:0x107f3ced8

我们知道s其实是指向数据常量区“abc”的一个指针,我们可以通过*s来获取字符串首字符的值:

printf("首字符为:%c",*s);

打印结果为:

首字符为:a

2. 如此我们联想oc当中的字符串NSString,现在我们用oc的方式初始化一个字符串:

NSString *str = @"abc";
NSLog("str的值为:%@",str);
NSLog("str的地址为:%p",str);

打印结果如下:

str的值为:abc
str的地址为:0x1027510c8 

3. 通过以上结果分析,我们在打印oc中字符串的值的时候为什么不能像c语言中直接使用指针*str,而是直接用%@打印str就获得了对象的值了呢,为什么不是这样的:

NSLog("str的值为:%@",*str);
  1. 其实NSString本身是一个对象,它不同于char *这些基本类型。本质上OC的对象是一个结构体。
    NSLog在打印%@格式的对象时,会直接调用对象的description方法。与基本数据类型的处理是有区别的。

例如下面的结构体:

typedef struct Object {
    char *string;
} *Object; 

打印的时候会进行如下:

Object obj = malloc(sizeof(Object));
obj->string = "Hello";
NSLog(@"%s", obj->string); 

所以oc的%@也并不是意味着值的打印,它代表的是打印对象。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值