[Objective-C语言教程]结构体(17)

Objective-C数组可定义包含多个相同类型的数据项的变量类型,但结构体是Objective-C编程中的另一个用户定义数据类型,它可组合不同类型的数据项。

结构体用于表示记录,假设要图书馆中跟踪书籍信息。可能希望跟踪每本书的以下属性 -

  • 标题
  • 作者
  • 学科
  • 书名

1. 定义结构体

要定义结构体,必须使用struct语句。 struct语句定义一个新的数据类型,为程序提供多个成员。 struct语句的格式如下所示 -

1 struct [structure tag] {
2    member definition;
3    member definition;
4    ...
5    member definition;
6 } [one or more structure variables];

structure tag是可选的,每个成员定义是一个普通的变量定义,例如int i;float f;或任何其他有效的变量定义。 在结构体定义的最后,在最后一个分号之前,可以指定一个或多个结构变量,但它是可选的。以下是声明Book结构体的示例 -

1 struct Books {
2    NSString *title;
3    NSString *author;
4    NSString *subject;
5    int   book_id;
6 } book;

2. 访问结构成员

要访问结构的任何成员,使用成员访问运算符(.)。成员访问运算符是结构体变量名称和要访问结构体成员之间使用句点(.)连接。使用struct关键字来定义结构类型的变量。以下是结构体用法的示例 -

 1 #import <Foundation/Foundation.h>
 2 
 3 struct Books {
 4    NSString *title;
 5    NSString *author;
 6    NSString *subject;
 7    int   book_id;
 8 };
 9 
10 int main() {
11    struct Books Book1;        /* 声明Book类型变量:Book1 */
12    struct Books Book2;        /* 声明Book类型变量:Book2 */
13 
14    /* book 1 指定值 */
15    Book1.title = @"Objective-C编程";
16    Book1.author = @"Yiibai"; 
17    Book1.subject = @"Objective-C编程教程";
18    Book1.book_id = 81234566;
19 
20    /* book 2 指定值 */
21    Book2.title = @"Java编程";
22    Book2.author = @"Maxsu";
23    Book2.subject = @"JavaC编程教程";
24    Book2.book_id = 813283488;
25 
26    /* 打印 Book1 信息 */
27    NSLog(@"Book 1 title : %@\n", Book1.title);
28    NSLog(@"Book 1 author : %@\n", Book1.author);
29    NSLog(@"Book 1 subject : %@\n", Book1.subject);
30    NSLog(@"Book 1 book_id : %d\n", Book1.book_id);
31 
32    /* 打印 Book2 信息 */
33    NSLog(@"Book 2 title : %@\n", Book2.title);
34    NSLog(@"Book 2 author : %@\n", Book2.author);
35    NSLog(@"Book 2 subject : %@\n", Book2.subject);
36    NSLog(@"Book 2 book_id : %d\n", Book2.book_id);
37 
38    return 0;
39 }

执行上面示例代码,得到以下结果 -

1 2018-11-15 07:18:43.096 main[21248] Book 1 title : Objective-C编程
2 2018-11-15 07:18:43.098 main[21248] Book 1 author : Yiibai
3 2018-11-15 07:18:43.098 main[21248] Book 1 subject : Objective-C编程教程
4 2018-11-15 07:18:43.098 main[21248] Book 1 book_id : 81234566
5 2018-11-15 07:18:43.098 main[21248] Book 2 title : Java编程
6 2018-11-15 07:18:43.098 main[21248] Book 2 author : Maxsu
7 2018-11-15 07:18:43.098 main[21248] Book 2 subject : JavaC编程教程
8 2018-11-15 07:18:43.098 main[21248] Book 2 book_id : 813283488

3. 结构体作为函数参数

可以将结构体作为函数参数传递,与传递任何其他变量或指针的方式非常相似。将以与上面示例中访问的方式类似,访问结构体变量如下代码 -

 1 #import <Foundation/Foundation.h>
 2 
 3 struct Books {
 4    NSString *title;
 5    NSString *author;
 6    NSString *subject;
 7    int   book_id;
 8 };
 9 
10 @interface SampleClass:NSObject
11 /* 函数声明 */
12 - (void) printBook:( struct Books) book ;
13 @end
14 
15 @implementation SampleClass 
16 
17 - (void) printBook:( struct Books) book {
18    NSLog(@"Book title : %@\n", book.title);
19    NSLog(@"Book author : %@\n", book.author);
20    NSLog(@"Book subject : %@\n", book.subject);
21    NSLog(@"Book book_id : %d\n", book.book_id);
22 }
23 
24 @end
25 
26 int main() {
27    struct Books Book1;        /* 声明 Book类型变量 Book1 */
28    struct Books Book2;        /* 声明 Book类型变量 Book2 */
29 
30    /* book 1 设置成员信息 */
31    Book1.title = @"Objective-C编程";
32    Book1.author = @"Yiibai"; 
33    Book1.subject = @"Objective-C编程教程";
34    Book1.book_id = 88774078;
35 
36    /* book 2 设置成员信息 */
37    Book2.title = @"数据结构与算法";
38    Book2.author = @"Strengthen";
39    Book2.subject = @"数据结构与算法教程";
40    Book2.book_id = 8899700;
41 
42    SampleClass *sampleClass = [[SampleClass alloc]init];
43    /* print Book1 info */
44    [sampleClass printBook: Book1];
45 
46    /* Print Book2 info */
47    [sampleClass printBook: Book2];
48 
49    return 0;
50 }

执行上面示例代码,得到以下结果 -

1 2018-11-15 07:24:14.437 main[50299] Book title : Objective-C编程
2 2018-11-15 07:24:14.439 main[50299] Book author : Yiibai
3 2018-11-15 07:24:14.439 main[50299] Book subject : Objective-C编程教程
4 2018-11-15 07:24:14.439 main[50299] Book book_id : 88774078
5 2018-11-15 07:24:14.439 main[50299] Book title : 数据结构与算法
6 2018-11-15 07:24:14.439 main[50299] Book author : Strengthen
7 2018-11-15 07:24:14.439 main[50299] Book subject : 数据结构与算法教程
8 2018-11-15 07:24:14.439 main[50299] Book book_id : 8899700

4. 指向结构的指针

按照与定义指向变量的指针相似的方式来定义指向结构体的指针,如下所示 -

struct Books *struct_pointer;

现在,可以将结构体变量的地址存储在上面定义的指针变量中。 要查找结构变量的地址,请使用&运算符放在结构体名称之前,如下所示 -

struct_pointer = &Book1;

要使用指向结构体的指针访问结构体的成员,必须使用 -> 运算符,如下所示 -

struct_pointer->title;

使用结构体指针重新编写上面的例子,希望读者容易理解 -

 1 #import <Foundation/Foundation.h>
 2 
 3 struct Books {
 4    NSString *title;
 5    NSString *author;
 6    NSString *subject;
 7    int   book_id;
 8 };
 9 
10 @interface SampleClass:NSObject
11 /* function declaration */
12 - (void) printBook:( struct Books *) book ;
13 @end
14 
15 @implementation SampleClass 
16 - (void) printBook:( struct Books *) book {
17    NSLog(@"Book title : %@\n", book->title);
18    NSLog(@"Book author : %@\n", book->author);
19    NSLog(@"Book subject : %@\n", book->subject);
20    NSLog(@"Book book_id : %d\n", book->book_id);
21 }
22 
23 @end
24 
25 int main() {
26    struct Books Book1;        /* 声明 Book 类型变量:Book1  */
27    struct Books Book2;        /* 声明 Book 类型变量:Book2  */
28 
29    /* book 1 设置成员的值 */
30    Book1.title = @"Objective-C编程";
31    Book1.author = @"Yii Bai"; 
32    Book1.subject = @"Objective-C编程教程";
33    Book1.book_id = 6495407;
34 
35    /* book 2 设置成员的值 */
36    Book2.title = @"数据结构与算法";
37    Book2.author = @"Strengthen";
38    Book2.subject = @"数据结构与算法教程";
39    Book2.book_id = 6495700;
40 
41    SampleClass *sampleClass = [[SampleClass alloc]init];
42    /* print Book1 info by passing address of Book1 */
43    [sampleClass printBook:&Book1];
44 
45    /* print Book2 info by passing address of Book2 */
46    [sampleClass printBook:&Book2];
47 
48    return 0;
49 }

执行上面示例代码,得到以下结果 -

1 2018-11-15 07:33:26.044 main[114068] Book title : Objective-C编程
2 2018-11-15 07:33:26.046 main[114068] Book author : Yii Bai
3 2018-11-15 07:33:26.046 main[114068] Book subject : Objective-C编程教程
4 2018-11-15 07:33:26.046 main[114068] Book book_id : 6495407
5 2018-11-15 07:33:26.046 main[114068] Book title : 数据结构与算法
6 2018-11-15 07:33:26.046 main[114068] Book author : Strengthen
7 2018-11-15 07:33:26.046 main[114068] Book subject : 数据结构与算法教程
8 2018-11-15 07:33:26.046 main[114068] Book book_id : 6495700

5. 位域

位字段允许在结构中打包数据。当内存或数据存储非常宝贵时,这尤其有用。 下面是一个典型例子 -

  • 将多个对象打包成机器字。 例如 可以压缩1位标志。
  • 读取外部文件格式 - 可以读入非标准文件格式。 9位整数。

Objective-C允许通过在变量之后放置:长度 来在结构定义中执行此操作。 例如 -

1 struct packed_struct {
2    unsigned int f1:1;
3    unsigned int f2:1;
4    unsigned int f3:1;
5    unsigned int f4:1;
6    unsigned int type:4;
7    unsigned int my_int:9;
8 } pack;

这里,packed_struct包含6个成员:四个1位标志f1..f3,4位类型和9my_int

Objective-C尽可能紧凑地自动打包上述位字段,前提是字段的最大长度小于或等于计算机的整数字长。 如果不是这种情况,那么一些编译器可能允许字段的存储器重叠,而其他编译器将下一个字段存储在下一个字中。

转载于:https://www.cnblogs.com/strengthen/p/10569873.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Scala01入门

第1章 可伸展的语言 Scala应用范围广&#xff0c;从编写脚本&#xff0c;到建立大型系统。 运行在标准Java平台上&#xff0c;与Java库无缝交互。 更能发挥力量的地方&#xff1a;建立大型系统或可重用控件的架构。 将面向对象和函数式编程加入到静态类型语言。 在Scala中&a…

架构师之路17年精选80篇

【架构必备】 《互联网架构如何实现“高并发”》4W 《TCP接入层的负载均衡、高可用、扩展性架构设计》2.2W 《配置中心架构设计演进》1.7W 《跨公网调用的大坑与架构优化》1.4W 《DNS在架构设计中的巧用》1.9W 《消息如何在网络上安全传输》1.2W 《10W定时任务&#xff0c;如何…

iphone手机型号获取

#import <sys/utsname.h> //手机型号 NSString *device [self iphoneType]; (NSString *)iphoneType { struct utsname systemInfo; uname(&systemInfo); NSString *platform [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if…

Java网络01基本网络概念

协议 Protocol&#xff1a;明确规则 &#xff08;1&#xff09;地址格式&#xff1b; &#xff08;2&#xff09;数据如何分包&#xff1b; ... TCP/IP四层模型&#xff1a; 应用层 HTTP SMTP POP IMAP 传输层 TCP UDP 网际层 IP 主机网络层 host to host layer 数模、…

apache的产品分类说明

分类 项目名 说明 开发语言 服务器&#xff08;共20&#xff09; Apache HTTP Server全球第一HTTP服务器C/CTomcatJava的Web服务器JavaJames邮件服务器JavaSpamAssassin反垃圾邮件C/CPerlApache的Perl编程语言支持C/CTclTCL脚本语言C/CDirectory Server超级目录服务器JavaAxisW…

Java网络02基本Web概念

URI Uniform Resource Identifier 同一资源标识符 以特定语法标识一个资源的字符串 绝对URI&#xff1a;URI模式模式特有部分 scheme:scheme-specific-part scheme分为&#xff1a; data file本地文件系统 ftp http telnet urn 统一资源名 scheme-specific-part为&am…

解决自建ca认证后浏览器警告

前一篇讲解了基本的建立证书的过程&#xff0c;但是建立后总是会在浏览器那里警告&#xff1a; 此链接不是私密链接 --谷歌浏览器 此证书颁发机构不可信 此证书不是这个网站的 --ie浏览器 总之证书是生成成功了&#xff0c;但是其中的内容填写错误了&a…

设计模式学习(三)——单例模式

在Java开发过程中&#xff0c;很多场景下都会碰到或要用到单例模式&#xff0c;在设计模式里也是经常作为指导学习的热门模式之一&#xff0c;相信每位开发童鞋都用到过。我们总是沿着前辈的足迹去做设定好的思路&#xff0c;往往没去探究为何这么做&#xff0c;所以这篇文章对…

Java网络03流

网络程序所做的很大一部分工作只是输入和输出&#xff1a;从一个系统向另一个系统移动数据。 输出流 Java的基本输出流类是java.io.OutputStream: public abstract class OutputStream 这个类提供了写入数据所需的基本方法&#xff0c;包括&#xff1a; public abstract vo…

基于微信小程序开发的仿微信demo

(本文参考自github/liujians,地址:https://github.com/liujians/weApp) 作者声明&#xff1a; 基于微信小程序开发的仿微信demo 整合了ionic的样式库和weui的样式库 使用请查看使用必读! 更新日志请点击这里 目前功能 查看消息 网络请求获取数据&#xff08;download示例server…

设计模式之六大原则

设计模式之设计原则 这软件设计过程中&#xff0c;有六大设计原则&#xff1a; 单一职责原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则开闭原则由于软件开发过程中&#xff0c;根据业务不同等因素形成了各种复杂的而不可预料的需求&#xff0c;遵守原则&#xff0c;让项…

安装配置tengine

安装tengine 1、依赖gcc openssl-devel pcre-devel zlib-devel 安装&#xff1a;yum install gcc openssl-devel pcre-devel zlib-devel 2、解压tengine压缩包&#xff0c;并进入目录&#xff1b; 3、./configure --prefix/usr/tengine 4、make && make install 5…

使用springboot集成jseesite

请访问 开源中国下的https://git.oschina.net/wolfking/wolfking-jeesitehttps://www.oschina.net/p/wolfking-jeesite?fromerr6Iie3qZt 下载源码&#xff0c;按照如下的运行使用 springboot 改造 jeesite&#xff0c;只保留最简单的系统配置 。 介绍 1、运行主类&#xff0c;…

解决idea 中web项目无法正常显示的问题

转载于:https://www.cnblogs.com/nulijiushimeili/p/10575364.html

Hadoop小知识点

hdfs命令行 上传 hadoop fs -put 文件名 hdfs://主机名:9000/... 下载 hadoop fs -get hdfs://主机名:9000/... 文件名 /hadoop/share/hadoop/mapreduce 文件夹下有测试程序 提交MapReduce任务命令 #hadoop jar hadoop-mapreduce-examples-2.4.1.jar pi 5 5 hadoop fs -m…

copy 扩展名 包含子文件夹 文件 到某个 文件夹

比如我在d:\fff下面有很多子文件夹&#xff0c;子文件夹里还有子文件夹&#xff0c;里面有些文件夹里有.ppm.bz2的后缀的文件&#xff0c;需要把他们找出来复制到d:\fff2里面&#xff0c;应该怎么用批处理写&#xff1f;最佳答案1234echo offfor /r d:\fff %%a in (*.ppm.bz2) …

在线视频常见加密方式及安全性透析

信息化时代&#xff0c;多媒体的应用日渐成为人们生活中不可或缺的部分&#xff0c;无论是获取最新资讯还是教育学习&#xff0c;视频都是直观高效的媒介之一。 基于互联网的快速传播&#xff0c;众多培训机构也逐渐将线下原创版权课程迁移到在线平台中&#xff0c;一方面可以更…

分享一个前后端分离的web项目(vue+spring boot)

Github地址&#xff1a;https://github.com/smallsnail-wh 前端项目名为wh-web后端项目名为wh-server项目展示地址为我的github pages&#xff08;https://smallsnail-wh.github.io&#xff09;用户名&#xff1a;admin&#xff0c;密码admin&#xff08;第一次启动会比较慢&am…

部署php项目到linux

服务器&#xff1a;39.106.26.67rootBayou2009 数据库&#xff1a;rootbayou2009 项目文件夹路径&#xff1a;/home/www/项目文件夹名称&#xff1a;education.bayou-tech.cn 绑定域名&#xff1a;education.bayou-tech.cn 绑定域名&#xff1a; 用ftp把配置文件下班到windows修…

ionic最新安装教程

公司最近开发webapp&#xff0c;研究了一下ionicangularjs开发。 安装过程中碰到许多问题&#xff0c;发现网上有好多资料都已经过时&#xff0c;在这里把最新的流程记录一下。 首先是安装node.js&#xff0c;通过nodejs官网下载&#xff0c;没什么问题。npm已经默认安装&#…