C 程式設計— 指標.

Slides:



Advertisements
Similar presentations
电子成绩单项目实现.
Advertisements

第1单元 操作系统概论 第一节 绪论 操作系统定义.
C语言基础——指针的高级应用 Week 05.
高级语言程序设计 C++程序设计教程(下) 2006年春季学期 与一些教材的区别 偏重理论,不去讨论某个系统的具体使用方法,但会涉及实现技术
第8章 字元與字串處理 8-1 C語言的字元檢查函數 8-2 C語言的字串 8-3 字串的輸入與輸出 8-4 指標與字串
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
程序设计基础.
第一章 C语言概述.
函數 授課:ANT 日期:2009/3/24.
選擇排序法 通訊一甲 B 楊穎穆.
陳維魁 博士 儒林圖書公司 第七章 參數的傳遞 陳維魁 博士 儒林圖書公司.
Chapter 5 – 指標和字串 目標: 能夠使用指標 能用指標藉著傳參照呼叫方式,將引數傳給函式 了解指標、陣列和字串間的密切關係
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
编译原理与技术 类型检查 2018/11/21 《编译原理与技术》-类型检查.
Introduction to the C Programming Language
函數 授課:ANT 日期:2011/3/28.
C 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
第7章 Linux环境编程.
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
C 程式設計— 指標 台大資訊工程學系 資訊系統訓練班.
C++ 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
STRUCTURE 授課:ANT 日期:2010/5/12.
计算概论 第十八讲 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语言程序设计 李祥.
程式設計 博碩文化出版發行.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第8章 善于利用指针 8.1 指针是什么 8.2 指针变量 8.3 通过指针引用数组 8.4 通过指针引用字符串 8.5 指向函数的指针
C语言 程序设计基础与试验 刘新国、2012年秋.
多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 多维数组元素的地址 先回顾多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
第八章 使用指针.
Introduction to the C Programming Language
第十章 指针.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
Speaker: Liu Yu-Jiun Date: 2009/4/29
計算機程式 授課教師:廖婉君教授 第六單元 Arrays
C语言复习2----函数.
Introduction to the C Programming Language
大豆有望继续跨年度牛市行情 各位领导,各位同仁,大家下午好,我是浙商期货的徐文杰,今天下午我们团队将要讲的题目是 大豆有望展开跨年度牛市行情
Oop8 function函式.
指標
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
第三章 数据抽象.
第九章 指针.
第二章 类型、对象、运算符和表达式.
本节内容 引用类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
C程序设计.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Introduction to the C Programming Language
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
C 程式設計— 字元與字串 台大資訊工程學系 資訊系統訓練班.
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
變數與資料型態  綠園.
資料!你家住哪裏? --談指標 綠園.
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
Introduction to the C Programming Language
函式庫補充資料 1.
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

練習時間 每一種資料型態的指標變數在32位元的作業系統環境中都佔用4個bytes,因為指標變數存放的是記憶體位址 比較輸出指標的位址與值.

指標運算 (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.)

傳入型態為指標 傳入變數位址 將變數改為指標型態 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

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

指標與陣列 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的二維整數陣列,並將陣列的資料列印出來 陣列表示法 指標表示法 array[i][j] *(*(array+i)+j)

問題: 請問下列程式的執行結果 #include <stdio.h> #include <stdlib.h> int main() { int x[5]={2,4,6,8,10},*p,**pp; p=x; pp=&p; printf("%d\n",*(p)); p++; printf("%d\n",**pp); system("pause"); return 0; }

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

動態記憶體配置 使用在某些陣列大小無法於事先決定的情況 需要用多少記憶體空間,就向系統要多少記憶體空間 C語言不能宣告一個陣列大小為變數的陣列 需要用多少記憶體空間,就向系統要多少記憶體空間 於執行過程中配置一個適當大小的記憶體空間給指標,接著藉由這個指標來存取分配到的記憶體空間內的資料

配置記憶體函式-malloc( ) 標頭檔: 語法:void *malloc(size_t size); 功能:動態配置記憶體 範例 #include <stdlib.h> #include <malloc.h> 語法:void *malloc(size_t size); 功能:動態配置記憶體 範例 char *ptr; ptr = (char *)malloc(sizeof(char)*9);

釋放記憶體函式-free( ) 標頭檔: 語法:void free(void *ptr); 功能:釋放記憶體 範例: #include <stdlib.h> #include <malloc.h> 語法:void free(void *ptr); 功能:釋放記憶體 範例: Free(ptr); 我們透過malloc函式取得的記憶體,可以於不需再使用的狀況下,透過free函式將之歸還給系統

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