Chapter 3.0 C語言的結構與指標 資料結構導論 - C語言實作.

Slides:



Advertisements
Similar presentations
许瑞云医师 你已经很努力地注意饮食、作息、运动, 为什么身体还不能恢复健康 ? 细节 答案就在「 细节 」裡, 唯有掌握关键的一步, 养生才能达到真 正的功效 ! 现在就让我们跟着曾是全球知名的哈 佛医院主治医师的许瑞云, 学习最正确 的养生方法, 轻松打下健康满分的基础 !
Advertisements

1 南郭國小 翁正雄 95/06/09 教育部健康醫學學習網傳統醫 學學習館交流研習 資料來源:教育部六大學習網及簡介 健康醫學學習網及簡介.
基本概論 Basic concepts.
电子成绩单项目实现.
第四章 心理健康.
99年成語200題庫(21-40).
腦筋要變通,舉一反三的創意; 和其他東西結合,馬上就有創意; 動詞用一下,就可以變花樣; 其實,創意超簡單,有用心就有創意。
2016中重卡网络规划 中重卡营销部 2016年6月.
第三章 鏈結串列 Linked List.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
数据结构与算法 数据结构与算法实验
第八章 类和对象.
第8章 字元與字串處理 8-1 C語言的字元檢查函數 8-2 C語言的字串 8-3 字串的輸入與輸出 8-4 指標與字串
第九章 系 统 安 全 性 9.1 结构体 9.2 结构体型数组  9.3 结构体型指针 9.4 内存的动态分配 9.5 共用体
Linked List(串列) Why Linked List? Pointer Dynamic Allocation
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Linked List Operations
單向鏈結串列 Singly Linked Lists.
第7章 结构体、联合体和枚举类型 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
C语言程序设计 第十二章 位运算.
程式設計 博碩文化出版發行.
C 程式設計— 結構 台大資訊工程學系 資訊系統訓練班.
資料大樓 --談指標與陣列 綠園.
複習 char name1[20]; //長度為20的字串 char name2[20]; //讀取字串 gets(name1);
資料結構 第5章 佇列.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
编译原理与技术 类型检查 2018/11/21 《编译原理与技术》-类型检查.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
Chap 9 结构 9.1 构建手机通讯录 9.2 结构变量 9.3 结构数组 9.4 结构指针.
第12章 樹狀搜尋結構 (Search Trees)
第9章 自訂資料型態 – 結構 9-1 結構資料型態 9-2 結構陣列 9-3 指標與結構 9-4 動態記憶體配置 9-5 聯合資料型態
STRUCTURE 授課:ANT 日期:2010/5/12.
C语言程序设计基础 第9章 结构 刘新国.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
Introduction to the C Programming Language
第4章 字串及資料的輸入/輸出格式.
C语言程序设计 李祥.
程式設計 博碩文化出版發行.
C 程式設計— 結構 台大資訊工程學系 資訊系統訓練班.
第3章 變數、常數與資料型態 3-1 C語言的識別字 3-2 變數的宣告與初值 3-3 指定敘述 3-4 C語言的資料型態
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
重點 資料結構之選定會影響演算法 選擇對的資料結構讓您上天堂 程式.
THE C PROGRAMMING LANGUAGE
第10章 檔案與資料夾處理 10-1 C語言的檔案輸入與輸出 10-2 文字檔案的讀寫 10-3 二進位檔案的讀寫
第13章 结构体的应用 13.1 了解由用户构造的数据类型 13.2 结构体类型说明及结构体变量 13.3 结构体数组
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第7章 陣列與指標 7-1 陣列的基礎 7-2 一維陣列的處理 7-3 二維與多維陣列的處理 7-4 陣列的函數參數
Struct結構 迴圈
C++程序语言设计 Chapter 3: The C in C++.
C语言程序设计.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
OOP6 結構Struct 黃兆武.
Speaker: Liu Yu-Jiun Date: 2009/4/29
本节内容 字节对齐.
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
C++程式設計入門 變數與運算子 作者:黃建庭.
聚合型第一種:隱沒帶、島弧 例子:臺灣東方的琉球海溝、南美洲智利海溝. 聚合型第一種:隱沒帶、島弧 例子:臺灣東方的琉球海溝、南美洲智利海溝.
本节内容 结构体数组.
本节内容 指针类型.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
本节内容 结构体数组 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 结构体数组 视频提供:昆山爱达人信息技术有限公司.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
安排座位.
園區多元智能教育中心 一年級課表 科園、龍山、實小
Presentation transcript:

Chapter 3.0 C語言的結構與指標 資料結構導論 - C語言實作

3.0.1 C語言的結構 結構的基礎 宣告結構型態 結構陣列 巢狀結構 建立新型態typedef 資料結構導論 - C語言實作

1.結構的基礎 結構(Structures)是C語言的延伸資料型態,這是一種自定資料型態(User-Defined Types),可以讓程式設計者自行在程式碼定義新的資料型態。 結構是由一或多個不同資料型態(當然可以是相同資料型態)所組成的集合,然後使用一個新名稱來代表,新名稱是一個新的資料型態,可以用來宣告結構變數。 struct Point { int x; int y; }; 資料結構導論 - C語言實作

2.宣告結構型態-結構宣告 在C程式宣告結構是使用struct關鍵字來定義新型態,其語法如下所示: 資料型態 變數1; 資料型態 變數2; …… }; 上述語法定義名為【結構名稱】的新資料型態,程式設計者可以自行替結構命名,在結構中宣告的變數稱為該結構的「成員」(Members)。 資料結構導論 - C語言實作

宣告結構型態-結構範例 例如:學生資料的結構student,如下所示: struct student { int id; char name[20]; int math; int english; int computer; }; 上述結構是由學號id、學生姓名name、數學成績math、英文成績english和電腦成績computer的成員變數所組成。 資料結構導論 - C語言實作

宣告結構型態-結構變數 當宣告student結構後,因為它是一種自訂資料型態,所以在程式碼可以使用這個新型態來宣告變數,其語法如下所示: struct 結構名稱 變數名稱; 上述宣告使用struct關鍵字開頭加上結構名稱來宣告結構變數,以本節程式範例為例,結構變數的宣告,如下所示: struct student std1; struct student std2 = {2, "江小魚", 45, 78, 66}; 資料結構導論 - C語言實作

宣告結構型態-結構運算 在建立好結構變數後,就可以存取結構各成員變數的值,如下所示: ANSI-C語言支援結構變數的指定敘述,如下所示: std1.id = 1; strcpy(std1.name, "陳會安"); std1.math = 78; std1.english = 65; std1.computer = 90; ANSI-C語言支援結構變數的指定敘述,如下所示: struct student std3; std3 = std2; 資料結構導論 - C語言實作

3.結構陣列 結構陣列(Arrays of Structures) 是結構資料型態的陣列。例如:test結構如下所示: struct test { int math; int english; int computer; }; 上述結構擁有3個成員變數,因為test是一種新型態,所以可以使用此型態建立陣列,如下所示: #define NUM_STUDENTS 3 struct test students[NUM]; 資料結構導論 - C語言實作

4.巢狀結構 巢狀結構(Nested Structures) 是在宣告的結構中擁有其它結構 例如:在student結構可以使用test結構儲存測驗成績,如下所示: struct test { int math; int english; int computer; }; struct student { int id; char name[20]; struct test score; 資料結構導論 - C語言實作

5.建立新型態typedef 在宣告結構型態後,為了方便宣告,我們可以使用一個別名來取代新的資料型態,這個別名是新增的識別字,可以用來定義全新的資料型態,其語法如下所示: typedef 資料型態 識別字; 上述識別字代表資料型態,所以可以直接使用此識別字宣告變數。例如:程式範例的test結構可以使用typedef指令定義新識別字的型態和宣告變數,如下所示: typedef struct test score; score joe; 資料結構導論 - C語言實作

3.0.2 指標(Pointers) C語言的指標 指標與陣列 指標與結構 資料結構導論 - C語言實作

1.C語言的指標 指標變數的使用 指向指標的指標變數 資料結構導論 - C語言實作

C語言的指標 C語言的「指標」(Points)屬於一種低階的程式處理功能,可以直接存取記憶體位址 指標變數的變數內容並不是字元或數值等基本資料型態的值,而是其它變數的「位址」(Address)。 換句話說,單獨存在的指標變數並沒有意義,因為它的值是其它變數的位址,程式需先宣告其它變數,才能取得指標變數的值,即指向其它變數的儲存位址。 資料結構導論 - C語言實作

指標變數的使用-說明 C語言的「指標變數」(Pointer Variables)是一種變數,其變數值是其它變數的位址(Address),如下圖所示: 資料結構導論 - C語言實作

指標變數的使用-宣告 指標變數的宣告和基本資料型態變數的宣告稍有不同,其宣告格式,如下所示: 資料型態 *變數名稱; 指標變數宣告和變數宣告只差變數名稱前的「*」星號,簡單的說,這個變數是指向宣告資料型態的指標變數,例如:指向整數int的指標變數宣告,如下所示: int *ptr; 資料結構導論 - C語言實作

指標變數的使用-取得變數位址 將指標變數ptr指向變數j的位址,取得變數位址是使用單運算元的「&」取址運算子,如下所示: ptr = &j; 資料結構導論 - C語言實作

指標變數的使用-初值 指標變數也可以在宣告時指定初值,不過取得位址的變數一定需要在指標變數前宣告,如下所示: int i; int *ptr1 = &i; 上述程式碼先宣告整數變數i,然後是指標變數ptr1,指標變數的初值是變數i的位址。 因為C語言的指標變數並沒有預設值,為了避免程式錯誤,例如:尚未指向其它變數的位址就使用指標變數,可以在宣告時指定成NULL常數,如下所示: int *ptr = NULL; 資料結構導論 - C語言實作

指標變數的使用-取得變數值 在C程式取得指標變數指向的變數值是使用單運算元的「*」星號運算子,稱為「取值」(Indirection)或「解參考」(Dereferencing)運算子,例如:ptr是指向整數變數j的指標變數,*ptr就是變數j的值,如下所示: printf("*ptr :位址%p的值=%d\n", ptr, *ptr); 上述printf()函數使用%p格式字元顯示指標變數的值,ptr是變數j的位址,*ptr是變數j的值。 資料結構導論 - C語言實作

2.指標與陣列 指標與陣列 指標與二維陣列 指標陣列 資料結構導論 - C語言實作

指標與陣列-說明 C語言的陣列配置的是一塊連續的記憶體空間,然後使用索引值存取陣列元素,如果改成指標變數,只需將指標變數指向陣列的第1個元素,元素存取就可以使用指標的數運算加和減來完成。 資料結構導論 - C語言實作

指標與陣列-指向陣列元素 宣告指標變數指向陣列的第1個元素,如下所示: int *ptr = array; C語言的陣列名稱就是陣列第1個元素的位址,因為陣列名稱本身是一個指標變數,如果使用取址運算子「&」,其程式碼如下所示: ptr = &array[0]; 資料結構導論 - C語言實作

指標與陣列-走訪陣列(方法1) 一共有2種方法存取其它陣列元素的值,如下所示: for ( i = 0; i < LEN; i++ ) printf("ptr+%d=%d ", i, *(ptr+i)); 資料結構導論 - C語言實作

指標與陣列-走訪陣列(方法2) 第2個方法是使用指標變數的遞增運算ptr++,如下所示: for ( i = 0; i < LEN; i++ ) printf("ptr+%d=%d ", i, *ptr++); 上述for迴圈使用指標走訪陣列元素,指標運算ptr++移到下一個元素,元素值是取值運算*(ptr++),這個方法會真正移動指標變數的位址,等到執行完迴圈,指標變數ptr是指向陣列的最後1個元素。 資料結構導論 - C語言實作

指標與二維陣列-範例 C語言的二維陣列也可以使用指標變數來存取陣列元素,例如:宣告一個二維整數陣列tables[][],如下所示: #define ROWS 4 #define COLS 5 int tables[ROWS][COLS]; 資料結構導論 - C語言實作

指標與二維陣列-方法1 視為一維陣列存取,因為二維陣列配置的記憶體空間是將每一列結合起來的連續記憶體位置,如同4列合一的一維陣列,如下所示: int *ptr; ptr = &tables[0][0]; 指標變數ptr指向陣列第1個元素的位址。接著使用指標運算取得每一個陣列元素,如下所示: for ( i=0; i < ROWS; i++) { for ( j=0; j < COLS; j++) printf("%d*%d=%2d ", (i+1), (j+1), *(ptr+(i*COLS)+j)); printf("\n"); } 資料結構導論 - C語言實作

指標與二維陣列-方法2 第二個方法是使用tables[ ][ ]陣列名稱的指標變數,其運算式如下所示: *(*(tables + i) + j) tables是二維陣列的名稱,可以將它視為是一個指向指標的指標變數,在中間括號部分的運算式,如下所示: *(tables+i) 上述指標運算可以當作是第一欄tables[ROWS][0]的指標運算,取值運算取得的是: tables[0][0](tables+0) tables[1][0](tables+1) tables[2][0](tables+2) tables[3][0](tables+3) 資料結構導論 - C語言實作

指標陣列-宣告 「指標陣列」(Arrays of Pointer)是指陣列的每一個元素都是一個指標變數,也就是說,陣列元素的值都是指向其它變數的位址。 指標陣列的宣告方式類似指標變數,如下所示: #define ROWS 4 int *tables[ROWS]; 上述程式碼宣告指標陣列tables[],一共擁有4個元素,每一個元素是一個整數的指標變數,可以指向整數或一個一維陣列,如果都是指向5個元素的一維陣列,相當於是宣告一個4 X 5的二維陣列。 資料結構導論 - C語言實作

指標陣列-差異 指標陣列和二維陣列的差異在指標陣列並不能指定初值,二維陣列在宣告後就配置ROWS X COLS個元素,指標陣列只配置ROWS個元素,指標陣列的最大好處是每一個指標指向的變數可以是不同長度,例如:不同元素分別指向整數或整數陣列。 資料結構導論 - C語言實作

指標陣列-圖例 資料結構導論 - C語言實作

指標陣列-存取 使用指標運算存取指標陣列的元素,如下所示: for ( i=0; i < ROWS; i++ ) { printf("*tables[%d]=%2d ", i, *tables[i]); printf("**(tables+%d)=%2d ", i, **(tables + i)); printf("**(ptr+%d)=%2d ", i, **(ptr + i)); } 上述for迴圈可以走訪指標陣列,然後使用*tables[i]、**(tables + i)和**(ptr + i)取得陣列元素的值。 資料結構導論 - C語言實作

3.指標與結構-宣告 指標也可以指向結構。例如:宣告lable結構儲存員工的姓名和年齡,如下所示: struct label { char name[20]; int age; }; 上述結構擁有2個成員變數,因為指標需要指向結構變數的位址,所以需要先宣告結構變數,然後才能建立指向結構的指標,如下所示: struct label worker; struct label *ptr; 資料結構導論 - C語言實作

指標與結構-存取 接著將結構指標指向結構,如下所示: ptr = &worker; 結構指標ptr指向結構變數worker的位址,換個方式,可以使用指標變數存取結構的成員變數,如下所示: (*ptr).age = 50; 程式碼相當於是worker.age = 50;。 C語言提供另一種語法,結構指標可以直接使用「->」運算子存取結構的成員變數,如下所示: ptr->age = 50; 資料結構導論 - C語言實作