資料大樓 --談指標與陣列 2008.12. 綠園.

Slides:



Advertisements
Similar presentations
While 迴圈 - 不知重複執行次數
Advertisements

小学科学中的化学 武威十九中 刘玉香.
行政法 之 行政救济篇.
第 2 章 初探 C++.
程序设计实习 3月份练习解答
第八課 蓼莪.
走自立自强之路 自己的事情自己做.
人類的循環系統.
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
第八章 类和对象.
走向C++之路 WindyWinter WindyWinter感谢诸位前来捧场。
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
函數(一) 自訂函數、遞迴函數 綠園.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
第一章 程序的基本结构. 第一章 程序的基本结构 教材及授课结构 本章目标 基本内容 扩展阅读 上机指导 应用举例 习题.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
Object-Oriented Programming in C++ 第一章 C++的初步知识
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
程式撰寫流程.
计算机网络讲义 第5章 批量数据处理—数组 一维数组 排序和查找 二维数组 字符串.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
C++程序设计 string(字符串类) vector(容器类).
C++语言程序设计 第二章 C++简单程序设计.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
3 數學運算 3.1 鍵盤輸入 輸入函數cin 多重輸入cin 輸出格式化 3-3
谭浩强 编著 中国高等院校计算机基础教育课程体系规划教材 C++程序设计.
C++语言程序设计 第十一章 流类库与输入/输出.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
Introduction to the C Programming Language
序及第0章.
第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析.
C++大学基础教程 第5章 数组 北京科技大学 信息基础科学系.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
六、函数 教学目标: 函数的概念、定义、调用和返回 带自定义函数的程序设计 递推算法 递归思想及算法实现 函数的参数传递方式 C语言程序设计.
C++大学基础教程 第3章 C++控制语句 北京科技大学 信息基础科学系.
C++大学基础教程 第11章 多态性 北京科技大学 信息基础科学系 2019/4/8 北京科技大学.
Name1..hour //加班時數 name2..hour //請假時數
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
Chapter 2 & Chapter 3.
C++语言程序设计 C++语言程序设计 第五章 函数 第十一组 C++语言程序设计.
程式結構&語法.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
Introduction to the C Programming Language
物件導向程式設計 CH2.
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
小学5.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++程式設計入門 變數與運算子 作者:黃建庭.
面向对象技术 练习 ffh.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
挑戰C++程式語言 ──第9章 函數.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
C++语言程序设计 第十章 C++标准模板库 成都信息工程学院计算机系.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
C++程序设计 概述 潘荣江 山东大学软件学院.
Introduction to the C Programming Language
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
變數與資料型態  綠園.
資料!你家住哪裏? --談指標 綠園.
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

資料大樓 --談指標與陣列 2008.12. 綠園

指標與陣列 陣列:是固定長度且連續的記憶體區塊。 指標:是一種特殊的變數,用來記錄所指向變數的位址。 陣列名稱本身是一個存放位址的「指標常數」,它儲存了陣列第一個元素的位址。 所以陣列的元素就可以利用指標的運算來存取。

指標與一維陣列 若宣告 int a[3]={5,7,9}; 則指標 a,所指的是a[0]的位址。 即: *a 和 a[0]的值是一樣的。

指標與一維陣列範例 #include <iostream> #include <cstdlib> using namespace std; int main(void) { int a[3]={5,7,9}; int i,sum=0; for(i=0;i<3;i++) sum += *(a+i); /* 同sum += a[i] */ cout << "sum=" << sum << endl; system("PAUSE"); return 0; }

雙重指標 指標不但可以指向任何一種資料型態的變數,還可以讓指標指向另一個指標變數,這種指向指標的指標,稱為雙重指標。 雙重指標 指標變數 一般變數 1200 1460 5 1000 1200 1460

雙重指標的宣告 雙重指標變數的宣告: 也可以這樣宣告: int **ptri; /*可指向整數的雙重指標*/ char **ptrc; /*可指向字元的雙重指標*/ 也可以這樣宣告: int *(*ptri); /*可指向整數的雙重指標*/ char *(*ptrc);/*可指向字元的雙重指標*/

雙重指標範例 int a=10, b, *p,**pp; p = &a; //圖解一 pp = &p; b = *p; cout << “a=” << a << “,b=” << b << endl; **pp = 30; //圖解三 cout <<“*p=” << *p <<“,**pp=” << **pp << endl; 執行結果: a=20,b=10      a=30,b=10      *p=30,**pp=30

雙重指標範例圖解一 int a=10, b, *p,**pp; p = &a; pp = &p; b = *p; 雙重指標 **pp 指標變數 *p 一般變數 a 10 一般變數 b int a=10, b, *p,**pp; p = &a; pp = &p; b = *p; 10

雙重指標範例圖解二 雙重指標 **pp 指標變數 *p 一般變數 a 20 一般變數 b *p = 20; 10

雙重指標範例圖解三 雙重指標 **pp 指標變數 *p 一般變數 a 30 一般變數 b **pp = 30; 10

二維陣列 vs. 雙重指標 int num[3][3]={{1,2,3},{4,5,6},{7,8,9}}; num[3][3] [0][0] [0][1] [0][2] [1][0] [1][1] [1][2] [2][0] [2][1] [2][2] 1 2 3 4 5 6 7 8 9 1000 1004 1008 1012 1016 1020 1024 1028 1032

二維陣列 vs. 雙重指標 指標常數 指標常數陣列 1 2 3 4 5 6 7 8 9 num 1000 num[0] 1000 1004 1008 4 5 6 num[1] 1012 *(num+1) 1012 1016 1020 7 8 9 num[2] 1024 *(num+2) 1024 1028 1032

二維陣列 vs. 雙重指標 1 2 3 4 5 6 7 8 9 num[3][3] num[0][0]的位址 *(num+0)+0 1000 1004 1008 4 5 6 1012 1016 1020 7 8 9 1024 1028 1032

二維陣列 vs. 雙重指標 1 2 3 4 5 6 7 8 9 num[3][3] num[0][0] *(*(num+0)+0) 1 1000 1004 1008 4 5 6 1012 1016 1020 7 8 9 1024 1028 1032

動態記憶體配置運算子 【new 與 delete】 利用 new 取得動態空間 int *ptr; ptr = new int; 可以合併寫成 int *ptr = new int(10); 利用 delete 釋放空間 delete ptr; ptr = NULL;

一維動態記憶體配置 int i, n; cin >> n; // 輸入5  // ptr 指向 n 個連續整數動態空間的首位空間位址   int *ptr = new int[n];  for(i=0; i<n; i++) *(ptr+i)=(i+1)*(i+1); n 5 ptr 0x4790 1 0x4790 4 0x4794 9 0x4798 16 0x479c 25 0x47a0 配置n個int

二維動態配置記憶體 int i, m, n; cin >> m >> n;  int **ptr = new int*[m];  for(i=0; i<m; i++)    ptr[i] = new int[n];

二維動態配置記憶體 …… int **ptr = new int*[m]; for(i=0; i<m; i++) ...... ptr[1][n-1] for(i=0; i<m; i++)   ptr[i] = new int[n]; int * ptr[0] ptr[1] ptr[2] ..... ptr[m-1] ptr[0][0] ptr[0][1] ptr[0][2] ...... ptr[0][n-1] ptr[2][0] ptr[2][1] ptr[2][2] ...... ptr[2][n-1] …… ptr [m-1][0] [m-1][1] [m-1][2] ...... [m-1][n-1]

釋放記憶體 一維動態配置的記憶體釋放 int *ptr = new int[n]; ...... delete[] ptr;    ......   delete[] ptr;   ptr = NULL;

釋放記憶體 二維動態配置的記憶體釋放 int **ptr = new int*[m]; for(i=0; i<m; i++)     ptr[i] = new int[n];    ......   for (i=0; i<m; i++)   {  delete[] ptr[i]; ptr[i] = NULL; } delete[] ptr; ptr = NULL;

指標與參照 指標:可以指向任意的同型態變數。 int i=10, j=20, *ptr; ptr = &i; ptr = &j; 參照:取得欲參考變數的位址,直接代替該變數。且一經設  定,就無法改變,必須從一而終。 int i=15, j=30; int &ref; //(X) int &ref = i; //(O) int &ref = j; //(X)

指標、參照與函數 函數傳回值為指標與參照之差異: int *func1(int *); int &func2(int &); ...... func1(a) = 100; // (X) func2(a) = 100; // (O) 因此,若是當程式中需要將函數裡的某個變數位址傳回,並為它設值時,指標就無用武之地,只能使用參照完成。