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

正文內容

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

2025-10-22 16:33 本頁面
 

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