Chapter 7 指標.

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

电子成绩单项目实现.
第1单元 操作系统概论 第一节 绪论 操作系统定义.
C++程序设计 王希 图书馆三楼办公室.
Chapter 3.0 C語言的結構與指標 資料結構導論 - C語言實作.
第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)
C程序设计 第9章 自定义数据类型 主讲教师: 鲁 萍 西安建筑科技大学 理学院.
Visual C++ introduction
函數 授課:ANT 日期:2009/3/24.
選擇排序法 通訊一甲 B 楊穎穆.
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
C 程式設計— 指標.
函數 授課:ANT 日期:2011/3/28.
第7章 Linux环境编程.
结构体和共用体 2 梁春燕 华电信息管理教研室.
Chap 9 结构 9.1 构建手机通讯录 9.2 结构变量 9.3 结构数组 9.4 结构指针.
C 程式設計— 指標 台大資訊工程學系 資訊系統訓練班.
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
第十一章 文件 文件概述 文件操作 文件操作实例 本章小结 作业: 练习:
第9章 自訂資料型態 – 結構 9-1 結構資料型態 9-2 結構陣列 9-3 指標與結構 9-4 動態記憶體配置 9-5 聯合資料型態
STRUCTURE 授課:ANT 日期:2010/5/12.
第九章 结构体和共用体 结构体的定义 结构体的使用 共用体的定义 共用体的使用 主讲:李祥 时间:2015年10月.
C語言簡介 日期 : 2018/12/2.
Function.
程序设计期末复习 黎金宁
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
程式撰寫流程.
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
C语言程序设计 李祥.
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
第13章 结构体的应用 13.1 了解由用户构造的数据类型 13.2 结构体类型说明及结构体变量 13.3 结构体数组
第八章 使用指针.
計數式重複敘述 for 迴圈 P
第十章 指针.
程式設計實習課(四) ----C 函數運用----
第一單元 建立java 程式.
Chapter 5 複合資料型態.
Struct結構 迴圈
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
第十章 指標.
指標
第三章 数据抽象.
C qsort.
第二章 类型、对象、运算符和表达式.
第14章 結構與其他資料形式.
陣列與結構.
C程序设计.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
Programming & Language Telling the computer what to do
Chapter 6 函數.
第6章 嵌入式软件开发基础.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
Array(陣列) Anny
Introduction to the C Programming Language
隨機函數.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

Chapter 7 指標

簡介 間接 模仿傳名呼叫 指令行參數 變數堆

指標 指標就像一個整數,固定一個數值 必須被宣告以它伴生的型: 常用於: 解釋為對象地址 “整數指標”, “浮點數指標”, 之類的 動態物件 (存放在 heap) 直接存取記憶體位址 (或是對應記憶體)

間接指標 藉由指標存取一個物件稱之間接 "address-of" 運算元 (&) 獲得對象的地址 "de-referencing“ 運算元 (*) 獲得對象的參考

Indirection Example #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i = 9, * ip = &i; printf("Address %p is %d\n", ip, *ip); *ip = 10; system("pause"); return 0; }/* Address 0012FF7C is 9 Address 0012FF7C is 10 */

Pointer Diagram

參考語意 當參數傳遞的時候可以參考語意 C 不支援直接存取 在C中 我們使用指標模擬 改變傳入的參數,原始參數也會變動 Java 並不支援

Simulating Reference Semantics #include <stdio.h> #include <stdlib.h> void swap(int* x, int* y) { int temp = *x; *x = *y; *y = temp; } int main(int argc, char *argv[]) { int i = 1, j = 2; swap(&i, &j); printf("i == %d, j == %d\n", i, j); system("pause"); return 0; // i == 2, j == 1

Ragged Arrays

命令行參數 通常使用在main程式中 argv 是 ragged array int main( int argc, char* argv[]) { … } argv 是 ragged array

Command-line Arguments #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i; for (i = 0; i < argc; ++i) printf("%s",argv[i]); system("pause"); return 0; } /* D:\>test hello there D:\test.exe hello there */

NULL 指標 一個特殊的值 並沒有指向任何地方 可以用來比較其他指標 e.g., 作為基礎 不能間接引用 NULL 位址是零 可以回傳指定的函式庫函數 不能間接引用 NULL

變數堆 間接地獲取藉由指標 居住在一個獨特的資料區 當要釋放變數時候 對於不知道要用多少變數而言是方便的 由 malloc() 函數達成 通常叫 "heap" or "dynamic storage" 當要釋放變數時候 藉由 free() 函數達成 對於不知道要用多少變數而言是方便的 就像一個你想多大就多大的陣列

C Heap Functions Defined in <stdlib.h>: void *malloc(size_t size); void free(void *memblock); void *calloc(size_t num, size_t size); void *realloc(void *memblock, size_t size);

Example #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXWIDTH 81 #define MAXLINES 100 int main(int argc, char *argv[]) { char* lines[MAXLINES]; char line[MAXWIDTH]; int i, n; for (n = 0; n < MAXLINES && gets(line) != NULL; ++n) { if ((lines[n] = (char *)malloc(strlen(line) + 1)) == NULL) exit(1); strcpy(lines[n], line); }/* Print in reverse order */ for (i = 0; i < n; ++i) { printf("%s\n",lines[n-i-1]); free(lines[n-i-1]); } system("pause"); return 0;

sizeof 運算子 傳回變數佔用的大小 是一個翻譯器運算子 計算陣列大小: int n = sizeof a / sizeof a[0]; 對於型態需要使用括號: float* p = malloc( sizeof( float));

Heap 中的 structs 使用 sizeof, 用法: struct Employee* p = malloc( sizeof( struct Employee)); 存取成員的方法: (*p).age = 47; 另一種方法 ( -> 運算子): p->age = 47;

structs as Arguments 通常會傳 struct 的位址 輸入指標參數 省去時間和空間

Example #include <stdio.h> #include <stdlib.h> struct Date { int year, month, day; }; void printDate(struct Date* p) { printf("%2d/%2d/%02d\n", p->month, p->day, p->year); } int main(int argc, char *argv[]) { struct Date d = { 98, 10, 2 }; printDate(&d); system("pause"); return 0; } // 10/ 2/98

Arrays as Arguments 傳遞整個陣列是沒有效率的 指標僅傳遞元素的位址 char* 及 char[] 代表相同的參數傳遞法 *argv[] 同義於 **argv