[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.pswp.cn/news/387200.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387200.shtml
英文地址,請注明出處:http://en.pswp.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已經默認安裝&#…