博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C 里指针变量星号 * 你会放在哪个位置
阅读量:6208 次
发布时间:2019-06-21

本文共 1646 字,大约阅读时间需要 5 分钟。

hot3.png

话说在 Objective-C 里声明指针变量时,星号(*) 该放到哪个位置,是紧贴变量类型,紧贴变量名还是放它们之间两边用空格,或者全挤在一起?到底还是在思考 C/C++ 中指针变量的声明风格,因为 Objective-C 是 C 的超集。

纯粹讲 Objective-C 的代码风格,我觉得 Google 的  非常有指导意义。转回来看 Objective-C 声明指针变量时什么风格好些,下面四种都符合语法:

1
2
3
4
5
NSString * name1 = @"Unmi"; //1. * 与变量类型与变量名之间都有空格
NSString* name2 = @"Unmi";  //2. * 紧挨变量类型,我推荐这种
NSString*name3 = @"Unmi";  //3. * 紧挨变量名
NSString*name4 = @"Unmi";   //4. * 变量类型、*、变量名紧挨在一起
NSLog(@"%@, %@, %@, %@", name1, name2, name3, name4);
至于中间两种风格,即 * 是靠向变量类型还是靠向变量名,各有千秋,可以继续参考 
 中关于 Pointer 的规范。其中否定了第一种写法,而且大约是没有提第四种写法的必要,第四种更是不可取的。对于中间两种都能接受,只是说要在你的项目中保持一致的风格。。看显然,第四种风格是最不好看的,就像有人写 SQL 喜欢 “select*from table1" 一样
。第一种风格看似没有倾向性,谁也不依靠,但还是要否定它,仍然未向我们传达较明确的含义。

我为什么会对指针变量的声明想那么多呢,来说说我的理解:

第二种写法,即 NSString* name2; 可以很直观的理解为变量类型就是 NSString* 这么一个指针类型,变量名为 name2,这于我们普通变量的声明方式是吻合的,因为接下来使用变量也是不用带 * 的 name2,而不是使用 *name2。这很好理解,就如 BOOL flag  = YES; flag = NO; 一样自然。

而且类型与*号一体表示类型还体现在参数或方法的返回型或是强制转型的情况,那是没理由把 * 号与类型拆分开的,如

- (NSString*) foo : (NSString*) param;

NSString* name = (NSSting*) anyType;

第三种写法该如何理解呢?*号标记在变量名上,类型应该说是 NSString 的指针类型,反正我是觉得不好理解,不够自然。而唯一能说得通这么写的理由是在一行中声明多个指针变量时:

1
2
3
4
5
6
7
8
9
NSString*name1, *name2, *name3, *name4;//它们全是指针类型
 
name1 = name2 = name3 = name4 = @"Unmi";//赋值
 
//不能用下面的方式,下面的 NSString 后的 * 只管到第一个,name1
//而后面的 name2, name3, name4 只认为是 NSString 类型
//NSString* name1, name2, name3, name4; //这样的话只有 name1 是指针类型
 
NSLog(@"%@, %@, %@, %@", name1, name2, name3, name4);
最后我还是觉得第二种像 NSString* name1;  的写法比较写意,并且也非常合乎规范,我就较喜欢这咱风格,可偏偏很多教材里热衷于第三种,即 NSString *name1 这样的风格。* 号紧贴变量名的方式好像只有在一行中同时声明多个指针变量时才通得过去,然而很多语言的规范都不推荐在一行中声明多个变量,所以似乎这种写法存在的理由也不够充分。

你呢?也许本身就无足轻重!

转载于:https://my.oschina.net/bigyuan/blog/77700

你可能感兴趣的文章
[故障解决]Mysql爆出ERROR 1044 (42000)的错误怎么办?
查看>>
Django运维后台的搭建之四:用bootstrap模板让运维前台变得更漂亮
查看>>
忘记 mysql 密码的取回方法
查看>>
[JavaScript] DOM操作技术
查看>>
不用开发实现RDS RDWeb门户美化和个性化
查看>>
mongodb morphia
查看>>
http协议介绍
查看>>
web管理
查看>>
交换机应用之端口模式(access、trunk和hybird)、是否标记(tag、untag)、端口缺省vlan(pvid、native id)...
查看>>
我的友情链接
查看>>
centos5.3搭建安全高效的LNMP服务器
查看>>
Python基础:搭建开发环境(1)
查看>>
MySQL之数据库对象查看工具mysqlshow
查看>>
漏洞发布平台-安百科技
查看>>
二、数据库设计与操作
查看>>
简单文件传输TFTP服务器搭建 Linux RHEL6
查看>>
Linux磁盘管理1
查看>>
VMware ubuntu 上网
查看>>
【学神】1-4 用户及用户组管理
查看>>
8位二进制补码表示整数的最小值是什么,最大值是什么
查看>>