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

正文內(nèi)容

c語言教程:c語言第四章(編輯修改稿)

2024-10-22 16:33 本頁面
 

【文章內(nèi)容簡介】 r(i=0。i10。 i++,p++) ? printf(%d, *p)。 ? } ? 則輸出的 10個數(shù)將是不確定的,原因是第一個循環(huán)后,指針 p移動到了數(shù)組 a的末尾。執(zhí)行第二個循環(huán)時, p的值不再是 a,而是 a+10。故輸出的將是 a數(shù)組之后的 10個元素,而這些空間的值是不可預(yù)知的。 ? ③ 使用指針時,應(yīng)特別注意避免指針訪問越界。在上例中,執(zhí)行第二個 for循環(huán)時 p已經(jīng)越過數(shù)組的范圍,但編譯器不能發(fā)現(xiàn)該問題。 ? ④ 指針變量的運算。設(shè)指針 p指向數(shù)組 a( p=a),則: ? p++(或 p += 1), p指向下一個元素。 ? *p++,相當(dāng)于 *(p++)。因為, *和 ++同優(yōu)先級, ++是右結(jié)合運算符。 ? *(p++)與 *(++p)的作用不同。 *(p++):先取 *p,再使 p加 1,即指向下一個元素;*(++p):先使 p加 1,再取 *p。 ? (*p)++表示, p指向的元素值加 1。 ? 如果 p當(dāng)前指向數(shù)組 a的第 i個元素,則: *(p)相當(dāng)于 a[i],先取 *p,再使 p減 1。*(++p)相當(dāng)于 a[++i],先使 p加 1,再取 *p。 *(p)相當(dāng)于 a[i],先使 p減 1,再取 *p。 ? ( 3)數(shù)組名作函數(shù)參數(shù) ? 既然數(shù)組名代表數(shù)組首地址,那么在函數(shù)調(diào)用時把數(shù)組名作函數(shù)實參,可以把數(shù)組首地址傳送給函數(shù)形參,當(dāng)然,要求形參也必須是一個數(shù)組或能接受數(shù)組首地址的數(shù)組指針變量。這樣,實參數(shù)組和形參數(shù)組將共同占用同一段內(nèi)存區(qū)域。從而實現(xiàn)在函數(shù)調(diào)用后,將形參數(shù)組元素的變化帶回給實參數(shù)組的元素。 ? 例 將數(shù)組 a中 n個元素按相反順序存放。 ? 算法:即 a[0]與 a[n1]交換, a[1]與 a[n2]交換, ....., a[(n1)/2]與 a[nint((n1)/2)]交換??梢杂?i, j作元素位置變量,開始 i=0,j=n1。將 a[i]與a[j]交換,然后 i加 1, j減 1,直到 i=(n1)/2時結(jié)束。 ? void inv(int x[ ], int n) /* 形參是數(shù)組 */ ? { int t,i,j,m=(n1)/2。 ? for(i=0。 i=m。 i++) ? {j = n 1 i。 ? t = a[i]。 a[i] = a[j]。 a[j] = t。 ? } ? return。 /* 函數(shù)的返回值類型是 void,不返回任何值 */ ? } ? main() ? { int i, a[10] = {3,7,9,11,0,6,7,5,4,2}。 ? printf(the original array:\n)。 ? for(i=0。 i10。 i++) ? printf(%d , a[i])。 ? printf(\n)。 ? inv(a,10)。 ? printf(the array hans been inverted:\n)。 ? for(i=0。 i10。 i++) ? printf(%d , a[i])。 ? printf(\n)。 ? } ? 函數(shù) inv()可以用指針作形參,運行情況與用數(shù)組作形參相同。 ? void inv(int *x, int n) ? { ? int *p, t, *i, *j, m=(n1)/2。 ? i = x。 /* 指針 i指向數(shù)組第一個元素 */ ? j = x + n 1。/* 指針 j指向數(shù)組最后一個元素 */ ? p = x + m。 /* 指針 p指向數(shù)組中間一個元素 */ ? for(; i=p; i++, j) ? { t = *i。 *i = *j。 *j = t。 } ? return。 ? } ? 例 從 10個數(shù)中找出其中最大值和最小值(只找出其中最大值和最小值,不能改變元素的排列順序)。 ? 方法 1:實參和形參均用數(shù)組變量。 ? int max, min。 /* 全局變量,最大值和最小值 */ ? void max_min_value(int array[], int n) ? {int *p, *array_end。 /* p是數(shù)組元素指針 */ ? array_end = array + n。 /* 指向數(shù)組尾 */ ? max = min = *array。 /*默認(rèn)最大和最小值為第一個元素 array[0]*/ ? for(p=array+1。 parray_end。 p++) /* p++指向下一個元素 */ ? if (*p max) max = *p。 ? else if (*p min) min = *p。 ? return。 ? } ? main() ? {int i, number[10]。 ? printf(enter 10 data\n)。 ? for(i=0。i10。i++) ? scanf(%d,amp。number[i])。 ? max_min_value(number,10)。 ? printf(\nmax=%d,min=%d\n,max,min)。 ? } ? 方法 2:形參和實參均使用指針變量。 ? int max, min。 /* 全局變量,最大值和最小值 */ ? void max_min_value(int *array, int n) ? {int *p, *array_end。 /* p是數(shù)組元素指針 */ ? array_end = array + n。 /* 指向數(shù)組尾 */ ? max = min = *array。 /*默認(rèn)最大和最小值為第一個元素 array[0] */ ? for(p=array+1。 parray_end。 p++) /* p++指向下一個元素 */ ? if (*p max) max = *p。 ? else if (*p min) min = *p。 ? return。 ? } ? main () ? {int i, number[10], *p。 ? p = number。 /* 指針 p指向數(shù)組 number首地址 */ ? printf(enter 10 data\n)。 ? for(i=0。i10。i++) ? scanf(%d,amp。number[i])。 ? printf(the 10 data:\n)。 ? for(p=number,i=0。 i10。 i++,p++) ? printf(%d , *p)。 ? p = number。/* for循環(huán)后 ,p指向數(shù)組尾,因此應(yīng)為 p重新賦值 */ ? max_min_value(p,10)。 ? printf(\nmax=%d,min=%d\n,max,min)。 ? } ? 另外還有兩種方法:形參用數(shù)組,實參用指針;形參用指針,實參用數(shù)組。道理是一樣的,都是通過將數(shù)組的首地址傳送給函數(shù)的形參,讓函數(shù)可以對主調(diào)函數(shù)中數(shù)組的單元進(jìn)行操作。 ? ( 4)多維數(shù)組的指針 ? 用指針可以指向一維數(shù)組,也可以指向多維數(shù)組,但在概念上和使用上,多維數(shù)組的指針比一維數(shù)組的指針要復(fù)雜一些,在此只對二維數(shù)組的指針作簡單介紹,讀者可由此查閱相關(guān)資料作進(jìn)一步學(xué)習(xí)。 ? 之前已經(jīng)介紹過,對于一個二維數(shù)組來講,可以視作一維數(shù)組來進(jìn)行理解。如有二維數(shù)組: ? int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}}。 ? 理解為:一維數(shù)組 a有三個元素, a[0]、 a[1]和 a[2]。每一個元素又是一個一維數(shù)組,包含四個元素。即: ? a → a[0] 1 3 5 7 ? a[1] 9 11 13 15 ? a[2] 17 19 21 23 ? 數(shù)組名 a代表整個二維數(shù)組的首地址,也是元素 a[0]的地址。同時 a[0]又是一個一維數(shù)組,代表第一行第一個元素的首地址。那么, a和 a[0]、a[1]、 a[2]的關(guān)系怎樣呢? a[0]、 a[1]、 a[2]作為一個一維數(shù)組,與二維數(shù)組的元素之間又是怎樣的關(guān)系呢? ? 實際上,我們可以把二維數(shù)組的指針分成行指針和列指針來理解。行指針即指向行的指針,列指針即指向列的指針。 ? 二維數(shù)組在內(nèi)存中是按行存儲的,每一行的元素空間是連續(xù)的。 a作為一維數(shù)組,它代表的是第一個元素 a[0]的地址,根據(jù)一維數(shù)組的指針來看, a+1代表 a[1]的地址, a+2代表 a[2]的地址。那么 *a、 *(a+1)、 *(a+2)分別代表了 a[0]、 a[1]和 a[2]。由于 a[0]、 a[1]和 a[2]不是一個數(shù)據(jù),而是二維數(shù)組中的一行數(shù)據(jù),因此可把 a、 a+1和 a+2看作二維數(shù)組的行指針。 ? 在二維數(shù)組 a中, a[0]看作一個一維數(shù)組,數(shù)組名為 a[0],它包含四個元素 a[0][0]、 a[0][1]、 a[0][2]和 a[0][3]。 a[0]作為這個一維數(shù)組的數(shù)組名,代表了該數(shù)組的首地址 (即第一個元素 a[0][0]的地址 ),根據(jù)一維數(shù)組指針的概念,則 a[0]+1代表 a[0][1]的地址, a[0]+2代表 a[0][2]的地址, a[0]+3代表 a[0][3]的地址。因此可把 a[0]看作二維數(shù)組的列指針,同理, a[1]和a[2]也是列指針。 ? 因此,在二維數(shù)組 a中,行指針和列指針以及數(shù)組元素之間存在以下等價關(guān)系: ? a、 amp。a[0]和 amp。amp。a[0][0]等價 ? *a、 a[0]和 amp。a[0][0]等價 ? **a、 *a[0]和 a[0][0]等價 ? a+ amp。a[1]和 amp。amp。a[1][0]等價 ? *(a+1)、 a[1]和 amp。a[1][0]等價 ? **(a+1)、 *a[1]和 a[1][0]等價 ? *a+ a[0]+1和 amp。a[0][1]等價 ? *(*a+1)、 *(a[0]+1)和 a[0][1] ? 綜上所述,二維數(shù)組的行、列指針和元素之間存在的關(guān)系可以歸納如下:行指針通過指針運算得到列指針,列指針通過指針運算得到數(shù)組的元素。 ? 例 用指針變量輸出二維數(shù)組元素的值。 ? main() ? { int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23}。 ? int *p。 ? for(p=a[0]。 pa[0]+12。 p++) /*p為列指針 */ ? { if ((pa[0])%4 == 0) ? printf(\n)。 ? printf(%4d, *p)。 ? } ? } ? 本例用指針順序訪問二維數(shù)組的元素(因為二維數(shù)組在內(nèi)存中按行順序存放)。若需訪問二維數(shù)組 a[n][m]( n行 m列)的某個元素 a[i][j],計算該元素的相對位置公式為: ? i*m+j ( i,j=0,1,2, ...) ? 這種方法相當(dāng)于把二維數(shù)組轉(zhuǎn)化為一維數(shù)組來使用。 ? 比較直接的就是用二維數(shù)組下標(biāo)來訪問元素,如: ? main () ? { int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23}。 ? int i,j。 ? for(i=0。 i3。 i++) ? { for(j=0。j4。j++) ? printf(%4d,a[i][j])。 ? printf(\n)。 ? } ? } ? 這種方式雖然清晰,但需進(jìn)行兩層循環(huán),且為了計算每一個元素 a[i][j]的位置,都要進(jìn)行 i*4+j的運算,執(zhí)行效率非常低。 ? 結(jié)構(gòu)體和指針 ? 為將不同類型但相互關(guān)聯(lián)的一組數(shù)據(jù),組合成一個有機(jī)整體使用, C語言提供一種稱為“結(jié)構(gòu)體”的數(shù)據(jù)結(jié)構(gòu)。 ? 例如,一個學(xué)生的學(xué)號、姓名、性別、年齡、成績、地址是互相聯(lián)系的數(shù)據(jù),但是類型不相同,在 C語言中就可以用“結(jié)構(gòu)體( structure)”來定義。定義后將其視作一個整體,其中學(xué)生的學(xué)號、姓名、性別、年齡、成績、地址作為其“成員”(或“分量”)來處理。它相當(dāng)于其他高級語言中的“記錄”。 ? struct student ? { int num。 /* 學(xué)號 */ ? char name[20]。 /* 姓名 */ ? char sex。 /* 性別 */ ? int age。 /* 年齡 */ ? float score。 /* 成績 */ ? char addr[30]。 /* 地址 */ ? }; ? struct是關(guān)鍵字,不能省略,它向編譯系統(tǒng)聲明這是一個“結(jié)構(gòu)體類型”,它包括 num、 name、 sex、 age、 score、addr等不同類型的數(shù)據(jù)項。 student是定義的結(jié)構(gòu)體類型名,
點擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1