C 程式設計— 指標 台大資訊工程學系 資訊系統訓練班.

Slides:



Advertisements
Similar presentations
基本概論 Basic concepts.
Advertisements

电子成绩单项目实现.
第1单元 操作系统概论 第一节 绪论 操作系统定义.
學習要點 1. 了解人力資源管理的策略重要性 2. 介紹何謂招募與裁員 3. 說明不同工作的最佳甄選工具 4. 解釋績效評估的各種方法
C语言基础——指针的高级应用 Week 05.
第8章 字元與字串處理 8-1 C語言的字元檢查函數 8-2 C語言的字串 8-3 字串的輸入與輸出 8-4 指標與字串
Introduction to the C Programming Language
程序设计基础.
第一章 C语言概述.
函數 授課:ANT 日期:2009/3/24.
陳維魁 博士 儒林圖書公司 第七章 參數的傳遞 陳維魁 博士 儒林圖書公司.
Chapter 5 – 指標和字串 目標: 能夠使用指標 能用指標藉著傳參照呼叫方式,將引數傳給函式 了解指標、陣列和字串間的密切關係
编译原理与技术 类型检查 2018/11/21 《编译原理与技术》-类型检查.
Introduction to the C Programming Language
C 程式設計— 指標.
函數 授課:ANT 日期:2011/3/28.
目录 10.1 指针的基本概念 10.2 指向变量的指针变量 10.3 指向数组的指针变量 10.4 指向函数的指针变量和指针型函数
C 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
第六章 运行时存储空间的组织和管理 术语 本章内容 讨论一个活动记录中的数据布局 程序执行过程中,所有活动记录的组织方式 过程的活动
C++ 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
Introduction to the C Programming Language
Function.
Object-Oriented Programming in C++ 第一章 C++的初步知识
第三章 C++中的C 面向对象程序设计(C++).
第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语言 程序设计基础与试验 刘新国、2012年秋.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
Ch02-基礎語法.
第八章 使用指针.
Introduction to the C Programming Language
第十章 指针.
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
语义分析概述 符号表 第六章 语义分析.
第7章 陣列與指標 7-1 陣列的基礎 7-2 一維陣列的處理 7-3 二維與多維陣列的處理 7-4 陣列的函數參數
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
Speaker: Liu Yu-Jiun Date: 2009/4/29
C语言复习3----指针.
計算機程式 授課教師:廖婉君教授 第六單元 Arrays
Introduction to the C Programming Language
大豆有望继续跨年度牛市行情 各位领导,各位同仁,大家下午好,我是浙商期货的徐文杰,今天下午我们团队将要讲的题目是 大豆有望展开跨年度牛市行情
Oop8 function函式.
第八章 指標 (Pointer).
指標
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
第三章 数据抽象.
參數 實際參數(Actual parameter)與形式參數(Formal parameter)
第九章 指针.
第二章 类型、对象、运算符和表达式.
本节内容 引用类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
C程序设计.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
本节内容 指针类型.
Introduction to the C Programming Language
05 方法. 05 方法 5.1 方法 在一個較大型的程式中,通常會將具有特定功能或經常重複使用的程式,撰寫成獨立的小單元,稱為「方法」(Method),並賦予方法一個名稱,當程式需要時就可以呼叫此方法來執行該段特定程式。(此種重複使用的程式小單元在其他語言中可能稱為程序、副程式或函式, Visual.
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
C 程式設計— 字元與字串 台大資訊工程學系 資訊系統訓練班.
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
C++程序语言设计 Chapter 14: Templates.
資料!你家住哪裏? --談指標 綠園.
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C语言基础学习 从外行到入门.
隨機函數.
Presentation transcript:

C 程式設計— 指標 台大資訊工程學系 資訊系統訓練班

課程大綱 C語言簡介 基本資料型態, 變數, 基本輸入輸出 控制敘述- 選擇控制與重覆控制 陣列 函式 指標 字元與字串 結構 檔案處理

本次上課大綱 指標與記憶體位址 指標運算 函式的傳指標呼叫 指標和陣列 指標與函式 多重指標 main函式的引數串列與回傳值

什麼是指標(pointer) 指標 一種變數 儲存記憶體位置 儲存在該記憶體中的可能是字元, 整數,指標本身變數的位置 程式可以間接取得該指標所指位址的變數值 節省記憶體空間 減少不必要的搬動 使用不當的話, 造成系統或程式嚴重的錯誤

存取記憶體內容

宣告指標變數 (1) 指標的宣告方式與變數的宣告方式相同, 只不過指標在變數前面多加一個 * 資料型態 *指標變數名稱 資料型態 *指標變數名稱 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr;

宣告指標變數 (2) int i=3; int *ptr; ptr=&i; ptr是一個指向整數型態的指標, 內容為該整數的位址 1012 3 1000 1004 1008 ptr是一個指向整數型態的指標, 內容為該整數的位址 i是一個整數, 內容為3, 與*ptr的值一樣 記憶體位址

取址運算子與指標運算子(1) &是取址運算子 用來取得該變數在記憶體的位址 &變數名稱 int i=3; int *ptr; ptr=&i; 1012 3 1000 1004 1008 記憶體位址 ptr是一個整數指標 *ptr取得該指標的內容值 &i取得該整數在記憶體中 的位址 i是一個整數

取址運算子與指標運算子(2) *是指標運算子 用來取得指標所指向位址的內容值 *指標變數名稱 int i; int *p; p=&i; 記憶體位址 記憶體位址 1012 1012 1000 1000 1004 1004 1008 1008 50 ?? 1012 1012

練習時間 比較輸出指標的位址與值.

指標運算 (1) 指定運算 加減運算 比較運算 差值運算 錯誤:int *p=10; 正確: int x=10; int *p=&x; 變數 int x = 10; 指標變數 int *x = (int *)10; x 10 *x &x 10 x

指標運算 (2) 加減運算 只能加常數值 將指標變數內容『加1』 依據指標指向的資料型態所佔用的記憶體單位大小,來決定移動多少個位址(加1代表加1個單位),以便指向正確的下一筆同樣資料類型的資料。 例子 int *p,*q; p=p+q; /* 不合法 */

指標運算 (3) 比較運算 例子 相同型態的指標變數可以做比較運算,藉由比較運算,我們可以得知記憶體位址的先後關係 較早配置記憶體的變數位於較高的記憶體位址 例子

指標運算 (4) 差值運算 兩個相同資料型態的指標變數可以做減法運算 代表兩個記憶體位址之間的可存放多少個該資料型態的資料 例子

傳址呼叫 (1) 傳值呼叫 call by value 傳址呼叫 call by address

Copyright 1992-2004 by Deitel & Associates, Inc Copyright 1992-2004 by Deitel & Associates, Inc. and Pearson Edition Inc. All right Reserved.

The original value of number is 5 The new value of number is 125 Copyright 1992-2004 by Deitel & Associates, Inc. and Pearson Edition Inc. All right Reserved.

Analysis of a typical call-by-value. (Part 1 of 2.) Before main calls cubeByValue : int main() number int cubeByValue( int n ) { { int number = 5 ; 5 return n * n * n; } n number=cubeByValue(number); } undefined After cubeByValue receives the call: int main() int cubeByValue( int n ) number { { int number = 5 ; 5 return n * n * n; } number = cubeByValue( number ); n } 5 After cubeByValue cubes parameter n and before cubeByValue returns to main : int main() int cubeByValue( int n ) number { { 125 int number = 5 ; 5 return n * n * n; } number = cubeByValue( number ); n } 5 Analysis of a typical call-by-value. (Part 1 of 2.)

and before assigning the result to 125 int main() { number = 5 ; number = cubeByValue( number ); } cubeByValue( n ) return n * n * n; number n After cubeByValue returns to main and before assigning the result to : undefined completes the assignment to Analysis of a typical call-by-value. (Part 2 of 2.)

傳址呼叫 (2) 傳值呼叫 傳址呼叫

傳入型態為指標 傳入變數位址 將變數改為指標型態 Copyright 1992-2004 by Deitel & Associates, Inc. and Pearson Edition Inc. All right Reserved.

The original value of number is 5 The new value of number is 125 Copyright 1992-2004 by Deitel & Associates, Inc. and Pearson Edition Inc. All right Reserved.

receives the call and before is cubed: main calls cubeByReference : int main() number void cubeByReference( int *nPtr ) { { 5 int number = 5 ; *nPtr = *nPtr * *nPtr * *nPtr; } cubeByReference( &number ); nPtr } undefined After cubeByReference receives the call and before *nPtr is cubed: int main() number void cubeByReference( int *nPtr ) { { 5 int number = 5 ; *nPtr = *nPtr * *nPtr * *nPtr; } cubeByReference( &number ); nPtr call establishes this pointer } After *nPtr is cubed and before program control returns to main : int main() number void cubeByReference( int *nPtr ) { { 125 125 int number = 5 ; *nPtr = *nPtr * *nPtr * *nPtr; } cubeByReference( &number ); called function modifies nPtr } caller’s variable Analysis of a typical call-by-reference with a pointer argument.

練習時間 SWAP #include<stdio.h> void swap(int *,int *); int main() { int i,j; i=1,j=2; swap(&i,&j); printf("%d %d",i,j); } void swap(int *p,int *q) int temp; temp=*p,*p=*q;*q=temp; SWAP

指標與陣列 int array[10]; 我們以陣列名為array代表陣列的起始位址, 以array+1表示下一個位址. 當宣告指標時, int *ptr; 則以ptr代表其位址, 以ptr+1代表下一個位址. 陣列其實也是指標的一種應用.

Copyright 1992-2004 by Deitel & Associates, Inc Copyright 1992-2004 by Deitel & Associates, Inc. and Pearson Edition Inc. All right Reserved.

Copyright 1992-2004 by Deitel & Associates, Inc Copyright 1992-2004 by Deitel & Associates, Inc. and Pearson Edition Inc. All right Reserved.

Array b printed with: Array subscript notation b[ 0 ] = 10 b[ 1 ] = 20 b[ 2 ] = 30 b[ 3 ] = 40 Pointer/offset notation where the pointer is the array name *( b + 0 ) = 10 *( b + 1 ) = 20 *( b + 2 ) = 30 *( b + 3 ) = 40   Pointer subscript notation bPtr[ 0 ] = 10 bPtr[ 1 ] = 20 bPtr[ 2 ] = 30 bPtr[ 3 ] = 40 Pointer/offset notation *( bPtr + 0 ) = 10 *( bPtr + 1 ) = 20 *( bPtr + 2 ) = 30 *( bPtr + 3 ) = 40 Program Output Copyright 1992-2004 by Deitel & Associates, Inc. and Pearson Edition Inc. All right Reserved.

練習時間 陣列其實也是指標的一種應用. 如果用array++會怎樣? 使用指標控制陣列. 如果用ptr++會怎樣?

指標與二維陣列 例子 int array[3][4], *ptr; ptr=(int *)array; (*(array+1))[1]跟*((array+1)[1])的比較

指標陣列 陣列裡面所包含的元素都是指標. 指標陣列型態 例子: int *int_ptr[10]; // 整數指標陣列 float *float_ptr[10]; double *double_ptr[10]; char *str[10]; 例子:

指標與函數 函數的名稱與陣列的名稱一樣, 都代表著起始位址, 同時也是一個指標的常數, 因此函數指標可做如下的宣告: 例子: void (*func)(void); 例子: 傳回整數的指標函數: 如果把程式中第9行的 *func(i) 變成 func(i)的話, 會怎樣?

指標的指標 (1) int * ptr; /* 指標 */ int ** ptr; /* 指向指標的指標 */ 位址 位址 整數值 雙重指標

指標的指標 (2)

指標的指標 (3) 多重指標與二維陣列 使用多重指標,將九九乘法表的乘法結果儲存在9*9的二維整數陣列,並將陣列的資料列印出來 陣列表示法 例子 使用多重指標,將九九乘法表的乘法結果儲存在9*9的二維整數陣列,並將陣列的資料列印出來 陣列表示法 指標表示法 array[i][j] *(*(array+i)+j)

main()的argc與argv 定義方式一 定義方式二: 定義方式三: argc表示命令列中參數字串的個數. int main(int argc,char *argv[]) 定義方式二: int main(int argc,char argv[][]) /* 使用二維字元陣列(字串陣列) */ 定義方式三: int main(int argc,char **argv) /* 使用指標的指標 */ argc表示命令列中參數字串的個數. argv表示指向命令列中所有參數字串的指標. 例子

今天學到了什麼 什麼是指標 如何使用指標運算 如何使用函式的傳指標呼叫 如何使用指標和陣列 如何使用指標與函式 如何使用多重指標 如何使用main函式的引數串列與回傳值