freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

從問題到程序ppt課件-在線瀏覽

2024-12-21 16:54本頁面
  

【正文】 接訪問空指針也同樣無理 , 是非法的 。聲明: int n, *p。 void *gp1,*gp2。 例: gp1 = amp。 // gp1指向 n( 值是 n的地址 ) gp2 = amp。 // gp2指向 x 若通用指針 gpt指向 g, g類型是指針 pt的指向類型,將gpt賦給 pt(要寫強制轉(zhuǎn)換)通過 pt保證正確訪問 g。n。 /*合法, p是 (int*) */ q = (double*)gp1。 編譯程序不能識別強制轉(zhuǎn)換錯誤 。賦回整型指針不會有問題。 指針類型代表一種觀點。 指針轉(zhuǎn)換是觀點轉(zhuǎn)換。C保證恢復(fù)到原有類型(轉(zhuǎn)回整型指針),被指對象還可用。通用指針沒提供被指對象的類型信息,所以不能通過它們直接使用被指對象 ? 通用指針最無用,唯一用途就是提供指針值 ? 標準庫的某些函數(shù)使用了通用指針(后面會看到) 指針與數(shù)組 C指針與數(shù)組關(guān)系密切 , 以指針為媒介可以完成各種數(shù)組操作 。 用指針做數(shù)組操作同樣要 特別注意 越界錯誤 。 指向數(shù)組元素的指針 類型合適的指針可以指向數(shù)組元素 。 int a[10] = {1,2,3,4,5,6,7,8,9,10}。a[0]。 p3 = amp。 p4 = amp。 p4沒 指向 a的元素,是指向 a最后元素向后一個位置。 數(shù)組 a p1 圖 7. 5 指向數(shù)組 a 的元素的 4 個指針 p2 p4 p3 寫數(shù)組名得到數(shù)組首元素地址,元素類型的指針值 。a[0]。 指針運算 當(dāng)指針 p指向數(shù)組元素時說 p指到了數(shù)組里 。 例: p1指向 a首元素,值合法( a[0]的地址), p1+1也合法( a[1]的地址)。由它們可間接訪問 a各元素。/* 給 a[2]賦值 */ p2 = p1 + 5。 /* 給 a[7]賦值 */ 可用減法訪問所指位置之前的元素: *(p2 2) = 4。 運算取得的指針值 ( 即使不間接訪問 ) 必須在數(shù)組范圍內(nèi) ( 可過末元素一位置 ) , 否則無定義 。其他常用指針運算: 用指針運算得到的值做指針更新: p2 = p2 2。 ++p3。 p3 += 2。 n = p3 – p2。 兩個指針不指在同一數(shù)組里時 , 比較大小沒有意義 。 兩指針指向同一數(shù)據(jù)元素 , 或同為空值時它們相等 。 設(shè) p1指向數(shù)組 a[0], p3指向 a[5]。 p3[2] = 8。 兩類寫法有等價效力 , 可以自由選用 。 通過數(shù)組名的元素訪問也可以采用指針寫法 。 注意: 數(shù)組名不是指針變量 ,特別是不能賦值,不能更改。 a += 3。 有些運算雖不賦值但也可能沒意義 。 p+1的值可根據(jù) p的值和數(shù)組元素大小算出 。 指針運算的基礎(chǔ) 。 基于指針的數(shù)組程序設(shè)計 指針運算是處理數(shù)組元素的另一方式,有時很方便。 p1 p2。 for (p1 = a。 ++p1) printf(%d\n, *p1)。 p1 p2 10。 for (p1 = a。 ++p1) printf(%d\n, *p1)。 數(shù)組參數(shù)的作用就是這樣實現(xiàn)的 。 前面函數(shù)體里參數(shù)用數(shù)組寫法 ( 對指針可這樣寫 ) 。 ( 數(shù)組參數(shù)就是利用指針實現(xiàn)的 ! ) 這也使采用數(shù)組參數(shù)的函數(shù)能修改實參數(shù)組 。 int intsum (int n, int a[]) { int i, m = 0。 i n。 return m。 所有指針大小都一樣,它們保存的都是地址值,各種類型的地址值采用同樣表示方式。實參是動態(tài)運行中確定的東西。求元素和: double sum(int n, double a[])。 y = sum(20, b)。 也可用 sum求 b中 下標 12到 24的一段元素之和 。 指針與數(shù)組操作函數(shù)實例 例 1, 用指針方式實現(xiàn)字符串長度函數(shù) 。 /*通過局部指針掃描串中字符 */ while (*s != 39。) { s++。 } return n。 while (*p != 39。) p++。 } 參數(shù)類型 (char*), 實參應(yīng)是字符串或存字符串的數(shù)組 例 2, 用指針實現(xiàn)字符串復(fù)制函數(shù) 。\039。 t++。\039。 t++。 // 空語句 } 注意優(yōu)先級與結(jié)合性 , 增量運算的作用與值等 。 begin != end。 } prt_seq(a, a+10)。 prt_seq(a, a+3)。 prt_seq(a+4, a+4)。 最后兩個調(diào)用對應(yīng)空序列 。 還可寫出許多類似函數(shù)。 b != e。 } 把序列中每個元素都用其平方根取代: void sqrt_seq (double *b, double *e) { for (。 ++b) *b = sqrt(*b)。 if (b == e) return 。 p != e。 return x / (e b)。如指向常量字符串或存著字符串的字符數(shù)組,通常指向字符串開始。 p r o g r a m m i n g \ 0 指針 p p r o g r a m m i n g \ 0 數(shù)組 a ( a ) ( b ) 定義字符指針時可用字符串常量初始化 , 如: char *p = Programming。 圖 (a) char a[] = Programming。 2) p和 a類型不同 , 大小不同 。 3) a的元素可以重新賦值 。e39。r39。\039。 C程序常用這種方式使用和操作字符數(shù)組內(nèi)容。 char line[NLINE]。 char *p。 while(p–lineNLINE1 amp。 (*p = gerchar())!=39。) ++p。\039。 *p != 39。 ++p) if (*p == 39。) ++count。 例:需要一組字符串,常用字符指針數(shù)組索引它們。分散管理不便。 也可定義其他類型的指針數(shù)組,如指向整數(shù)或者其他類型的指針的數(shù)組,下面討論以字符指針為例 。 優(yōu)先級也適用于定義 。 定義字符指針數(shù)組時用字符串常量提供初始值 。 簡單實例 : printf(Work days: )。 i6。 printf(\nWeekend: )。 字符指針數(shù)組實例 : 改寫第 6章的 C語言關(guān)鍵字統(tǒng)計程序 , 把原來的兩維字符數(shù)組 keywords改為字符指針數(shù)組 。 其他部分不需要改,程序可以正常工作。定義: char color1[][6]={RED,GREEN,BLUE}。 R E D \0 \0 \0 G R E E N \0 B L U E \0 \ 0( a)數(shù)組 color1指針數(shù)組 colorR E D \0G R E E N \0B L U E \0 ( b)命令行參數(shù)的處理 啟動程序的基本方式是輸入命令 , 要求 OS裝入程序代碼文件并執(zhí)行 。 在圖形用戶界面系統(tǒng) ( 如 Windows) 里 , 命令行存在于圖標 /菜單的定義中 。 鍵入命令: abcd 該程序就會被裝入執(zhí)行 。 DOS命令: copy a:\ dir \windows\system /p 附加信息也是字符序列 , 稱為 命令行參數(shù) 。 處理命令行參數(shù)很像處理函數(shù)參數(shù) , 寫程序時要考慮和處理程序啟動時實際命令行提供的信息 。 命令名編號為 0,其余依次編號。 設(shè)有程序 prog1;設(shè)啟動程序的命令行是: prog1 there are five arguments 這時 prog1是編為 0的命令行參數(shù) , there是編號 1的命令行參數(shù) , … ;共 5個命令行參數(shù) 。 main(void)表示不處理命令行參數(shù) , main的另一形式帶兩個參數(shù): int main (int argc, char *argv[])。參數(shù)類型確定。 可以訪問啟動程序的命令名本身。 例:寫程序 echo打印各命令行參數(shù) 。 for (i = 0。 ++i) printf(Args[%d]: %s\n, i, argv[i])。 } 書上有另一種定義方式,其中利用了最后的空指針 用 IDE開發(fā)程序時 , 編輯 /調(diào)試 /執(zhí)行等工作都在環(huán)境里完成 , 執(zhí)行程序時如何提供命令行參數(shù) ? 集成開發(fā)環(huán)境都有專門機制為啟動命令行提供參數(shù) ( 如TurboC的 Options/Arguments) 。 在圖形用戶界面系統(tǒng)里 , 有關(guān)命令行參數(shù)的討論同樣有效 。 一些圖形界面系統(tǒng)里可把數(shù)據(jù)文件拖到程序文件上作為處理對象 。 多維數(shù)組作為參數(shù)的通用函數(shù) 函數(shù)的兩維或多維數(shù)組參數(shù)必須說明除第一維外各維的大小,這使函數(shù)失去了一般通用性??梢酝ㄟ^技術(shù)解決。 考慮: int fun1(int n, int mat[][10]) { ... ... mat[i][j] ... ... } 只能對第二維長 10的數(shù)組使用 。 定義沒給出一維數(shù)組大小 , 指針定義不完全 這樣 , 編譯程序雖然知道 mat[0]的位置 , 但卻無法算出 mat[1]等子數(shù)組位置以及 mat[i][j]位置 。 實際中確實需定義處理多維數(shù)組的通用函數(shù) 。 為什么 ? 解決方案: 考慮數(shù)組 int a[10][8]。a[0][0]。a[0][0] + 8 訪問第 1行首元素用表達式: *(amp。a[0][0] + i*8) 訪問 a[i][j]: *(amp。 通過參數(shù)可得到數(shù)組的首元素位置和各維長。 void prtMatrix (int m, int n, int *mp){ int i, j。 i m。 j n。 putchar(39。)。a[0][0])。mat[0][0])。 高級語言編程不需要考慮存儲細節(jié),有關(guān)工作由編譯程序完成。 在 C 語言里 ? 外部變量 /局部靜態(tài)變量在編譯的時候確定存儲,開始執(zhí)行前分配存儲 ? 自動變量在執(zhí)行進入定義函數(shù)時分配存儲 共同性質(zhì): 變量大小都是靜態(tài)確定的 。這樣,函數(shù)需要的存儲量就可在編譯時確定。 但對編程方式加了限制,有些問題不好解決。但編程時并不知道運行時需要處理多少學(xué)生成績,每次處理的成績項數(shù)也可能不同。 ... scanf(%d, amp。 double scores[n]。 至今討論的機制無法很好解決這類問題。 若分析正確 , 一般都能處理 。 2) 定義盡可能大的數(shù)組以滿足任何需要 。 如有多個這種數(shù)組就更難辦 。 解決的辦法是 “ 動態(tài)存儲分配 ” 。 這里的問題:程序運行中需要使用存儲 , 有時程序?qū)Υ鎯Φ男枨罅吭趯懗绦驎r不能確定 。在運行中根據(jù)需要動態(tài)進行。動態(tài)分配的存儲塊沒有名字,因此需要其他訪問途徑。用指針指向存儲塊,間接使用被指存儲。 與此對應(yīng):動態(tài)釋放,不用的動態(tài)存儲塊應(yīng)交還。 大部分常規(guī)語言都有這種機制。原型: void *malloc(size_t n)。 無法滿足時返回空指針值 。 double *data。n)。 if (data == NULL) { .... /* 分配未完成時的處理 */ } ..data[i]..*(data+j)../*正常處理 */ malloc的返回值( void*)應(yīng)通過類型強制轉(zhuǎn)為特定指針類型后賦給指針變量。越界使用(尤其是越界賦值)是嚴重錯誤,可能導(dǎo)致程序或系統(tǒng)垮臺 2) 帶計數(shù)和清 0的存儲分配函數(shù) calloc。 size是元素大小 , n是個數(shù) 。 前面的存儲分配問題也可用下面語句實現(xiàn): data = (double*)calloc(n, sizeof(double))。 3) 動態(tài)存儲釋放函數(shù) free。 free釋放 p指的存儲塊 。 不允許間接訪問已釋放存儲塊 ? 不要對并非指向動態(tài)分配塊的指針用本操作 為保證動態(tài)存儲的有效使用 , 動態(tài)分配塊不再用時應(yīng)釋放 。 程序例子: int fun (...) { int *p。 ... free(p)。 } /*退出函數(shù)前應(yīng)釋放函數(shù)內(nèi)分配且已無用的動態(tài)存儲 */ fun退出時 p存在期結(jié)束,若沒有訪問分配塊的其他途徑,將不可能再用到函數(shù)里分配的存儲塊。 如程序長期執(zhí)行,存儲
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1