• /  77
  • 下載費用: 9.90積分  

C語言程序設計教學課件作者第2版chap08_指針.ppt

'C語言程序設計教學課件作者第2版chap08_指針.ppt'
Chap 8 指針 8.1 尋找保險箱密碼 8.2 角色互換 8.3 冒泡排序 8.4 電碼加密 8.5 任意個整數求和* 本章要點變量、內存單元和地址之間是什么關系? 如何定義指針變量,怎樣才能使用指針變量? 什么是指針變量的初始化? 指針變量的基本運算有哪些?如何使用指針操作所指向的變量? 指針作為函數參數的作用是什么? 如何使用指針實現函數調用返回多個值? 如何利用指針實現內存的動態分配? 8.1 尋找保險箱密碼 一個關于國安局特工尋找保險箱密碼的故事…關鍵點分析得到線索:地址為2170的房間內有線索 提示地址:1976找到目標:地址為1976的房間取出內容:9118.1 尋找密碼的途徑分析密碼存放需要一定的存儲空間作為存放地,每個存放地都會有地址 如果知道了存放地的名字,當然能夠找到密碼。但并不是每個存儲空間都有名字 如果不知道存放地的名字,知道該存放地的地址也能夠取出密碼 如果連存放地的地址也不知道,但是有另外一個地方存放了該密碼存放地的地址,那么找到這個地方,就能順藤摸瓜,間接找到密碼8.1 密碼存放示意圖9111976P19762170名字P地址21701976內容1976911例8-1 利用指針模擬尋找保險箱密碼的過程 獲取密碼的兩種方法 int main(void){ int key = 911; /* 變量key用于存放密碼值911 */ int *p_addr = NULL; /* 變量p_addr是整型指針變量 */   p_addr = &key; /* 將key的地址賦給p_addr */ /* 通過變量key輸出密碼值*/ printf("The key is: %d\n", key); /* 通過變量名key輸出密碼值*/ printf("If I know the name of the variable, I can get it’s value by name: %d\n ", key); /* 通過變量key的地址來輸出密碼值 */ printf("If I know the address of the variable is: %x, then I also can get it’s value by address: %d\n",p_addr, *p_addr);   return 0;} If I know the name of the variable, I can get it’s value by name: 911If I know the address of the variable is:12ff7c, then I also can get it’s value by address: 9118.1.2 地址和指針-指針的概念 內存單元地址 內容 變量int x = 20, y = 1, z = 155;printf("%d", x;)直接訪問:通過變量名訪問間接訪問:通過另一個變量訪問把變量的地址放到另一變量中使用時先找到后者再從中取出前者的地址1000 20 x1002 1 y1004 155 z2000 1000 p2002地址 指針變量指針 內存單元地址 內容 變量int x = 20, y = 1, z = 155;printf("%d", x;)1000 20 x1002 1 y1004 155 z2000 1000 p2002地址 指針變量指針變量:存放地址的變量某個變量的地址指向指針變量所指向的變量的類型int *p; p 是整型指針,指向整型變量float *fp; fp 是浮點型指針,指向浮點型變量char *cp; cp 是字符型指針,指向字符型變量類型名 * 指針變量名指針聲明符8.1.3 指針變量的定義指針變量的定義類型名 * 指針變量名int * p;指針變量名是 p,不是*p* 是指針聲明符int k, *p1, *p2; 等價于:int k;int *p1;int *p2; 定義多個指針變量時,每一個指針變量前面都必須加上* 8.1.4 指針的基本運算 * 間接訪問運算符,訪問指針所指向的變量*p:指針變量 p 所指向的變量a3&ap*p如果指針的值是某個變量的地址,通過指針就能間接訪問那個變量。1、取地址運算和間接訪問運算 & 取地址運算符,給出變量的地址int *p, a = 3;p = &a; 把 a 的地址賦給 p,即 p 指向 a指針變量的類型和它所指向變量的類型相同# include int main (void){ int a = 3, *p; p = &a; printf (“a=%d, *p=%d\n”, a, *p); *p = 10; printf("a=%d, *p=%d\n", a, *p); printf("Enter a: "); scanf("%d", &a); printf("a=%d, *p=%d\n", a, *p); (*p)++; printf("a=%d, *p=%d\n", a, *p);  return 0;} 例8-2指針取地址運算和間接訪問運算 a3&ap*pa = 3, *p = 3a = 10, *p = 10Enter a: 5 a = 5, *p = 5a = 6, *p = 6 a3&ap*p(1) 當 p = &a 后,*p 與 a 相同(2) int *p; 定義指針變量 p *p =10; 指針p所指向的變量,即a(3) &*p 與 &a 相同,是地址 *&a 與 a 相同,是變量(4) (*p)++ 等價于 a++ 將 p 所指向的變量值加1 *p++ 等價于 *(p++) 先取 *p,然后 p 自加,此時p不再指向a說明 int a = 1, x, *p;p 。省略部分。io.h gets(str) 輸入字符串(回車間隔) strcpy(s1,s2) s2 ==> s1 strcat(s1,s2) s1 “+” s2 ==> s1 若 s1“==”s2, 函數值為0 strcmp(s1,s2) 若 s1 “>” s2, 函數值 >0 string.h 若 s1 “<” s2, 函數值<0 計算字符串的有效長度, strlen(str) 不包括 ‘\0’字符串處理函數小結int main( ) { int i; int x, min; scanf("%d", &x); min = x; for(i = 1; i < 5; i++){ scanf("%d", &x); if(x < min) min = x; } printf("min is %d\n", min); return 0; } 例8-11 求最小字符串#include int main( ) { int i; char sx[80], smin[80]; scanf("%s", sx); strcpy(smin,sx); for(i = 1; i < 5; i++){ scanf("%s", sx); if(strcmp(sx, smin)<0) strcpy(smin,sx); } printf("min is %s\n", smin); return 0;} 2 8 -1 99 0 min is –1 tool key about zoo sea min is about 8.5 任意個整數求和 * 例8-12 先輸入一個正整數n,再輸入任意n個整數,計算并輸出這n個整數的和。 要求使用動態內存分配方法為這n個整數分配空間。 8.5.1 程序解析int main ( ){ int n, sum, i, *p;  printf("Enter n: "); scanf("%d", &n); if ((p = (int *) calloc (n, sizeof(int))) == NULL) { printf("Not able to allocate memory. \n"); exit(1); } printf("Enter %d integers: ", n); for (i = 0; i < n; i++) scanf("%d", p+i); sum = 0; for (i = 0; i < n; i++) sum = sum + *(p+i); printf("The sum is %d \n",sum); free(p);   return 0;} Enter n: 10Enter 10 integers: 3 7 12 54 2 –19 8 –1 0 15The sum is 81 8.5.2 用指針實現內存動態分配 變量在使用前必須被定義且安排好存儲空間全局變量、靜態局部變量的存儲是在編譯時確定,在程序開始執行前完成。自動變量,在執行進入變量定義所在的復合語句時為它們分配存儲,變量的大小也是靜態確定的。一般情況下,運行中的很多存儲要求在寫程序時無法確定。動態存儲管理 不是由編譯系統分配的,而是由用戶在程序中通過動態分配獲取。使用動態內存分配能有效地使用內存使用時申請用完就釋放同一段內存可以有不同的用途 動態內存分配的步驟 (1)了解需要多少內存空間(2)利用C語言提供的動態分配函數來分配所需要的存儲空間。(3)使指針指向獲得的內存空間,以便用指針在該空間內實施運算或操作。 (4)當使用完畢內存后,釋放這一空間。 動態存儲分配函數malloc()void *malloc(unsigned size) 在內存的動態存儲區中分配一連續空間,其長度為size若申請成功,則返回一個指向所分配內存空間的起始地址的指針若申請內存空間不成功,則返回NULL(值為0)返回值類型:(void *)通用指針的一個重要用途將malloc的返回值轉換到特定指針類型,賦給一個指針 malloc()示例/* 動態分配n個整數類型大小的空間 */if ((p = (int *)malloc(n*sizeof(int))) == NULL) { printf(“Not able to allocate memory. \n”); exit(1);} 調用malloc時,用 sizeof 計算存儲塊大小每次動態分配都要檢查是否成功,考慮例外情況處理 雖然存儲塊是動態分配的,但它的大小在分配后也是確定的,不要越界使用。 計數動態存儲分配函數calloc ()void *calloc( unsigned n, unsigned size) 在內存的動態存儲區中分配n個連續空間,每一存儲空間的長度為size,并且分配后還把存儲塊里全部初始化為0若申請成功,則返回一個指向被分配內存空間的起始地址的指針若申請內存空間不成功,則返回NULLmalloc對所分配的存儲塊不做任何事情calloc對整個區域進行初始化 動態存儲釋放函數free void free(void *ptr) 釋放由動態存儲分配函數申請到的整塊內存空間,ptr為指向要釋放空間的首地址。當某個動態分配的存儲塊不再用時,要及時將它釋放 分配調整函數realloc void *realloc(void *ptr, unsigned size) 更改以前的存儲分配ptr必須是以前通過動態存儲分配得到的指針參數size為現在需要的空間大小如果調整失敗,返回NULL,同時原來ptr指向存儲塊的內容不變。如果調整成功,返回一片能存放大小為size的區塊,并保證該塊的內容與原塊的一致。如果size小于原塊的大小,則內容為原塊前size范圍內的數據;如果新塊更大,則原有數據存在新塊的前一部分。如果分配成功,原存儲塊的內容就可能改變了,因此不允許再通過ptr去使用它。 本章要點小結變量、內存單元和地址之間是什么關系? 如何定義指針變量,怎樣才能使用指針變量? 什么是指針變量的初始化? 指針變量的基本運算有哪些?如何使用指針操作所指向的變量? 指針作為函數參數的作用是什么? 如何使用指針實現函數調用返回多個值? 如何利用指針實現內存的動態分配?
關 鍵 詞:
教學 作者 chap chap08 程序設計 08 c語言 指針
 天天文庫所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
關于本文
本文標題:C語言程序設計教學課件作者第2版chap08_指針.ppt
鏈接地址: http://www.476824.live/p-51617241.html
關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服點擊這里,給天天文庫發消息,QQ:1290478887 - 聯系我們

本站為“文檔C2C交易模式”,即用戶上傳的文檔直接賣給(下載)用戶,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有【成交的100%(原創)】。本站是網絡服務平臺方,若您的權利被侵害,侵權客服QQ:1290478887 歡迎舉報。

[email protected] 2017-2027 http://www.476824.live 網站版權所有

粵ICP備19057495號 

收起
展開
球探网即时蓝球比分 股票融资费率·杨方配资 江西时时彩三星技巧 三明期货配资 时时乐餐厅怎么样 秒秒彩的原理 658配资 天天彩选四开奖号码 喜乐彩新疆开奖 散户炒股 山东十一选五胆拖对照表