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

正文內(nèi)容

c程序設(shè)計指針ppt課件-資料下載頁

2025-01-19 19:19本頁面
  

【正文】 ) scanf(%D, arr+i)。 printf(\n)。 inv(arr, 10)。/*實參為指針變量,但未被賦值 */ printf(The array haS Been inverteD: \n)。 for(i=0。i< 10。i++) printf(%D, *(arr+i))。 printf(\n)。 } 編譯時出錯,原因是指針變量 arr沒有確定值,談不上指向哪個變量。下面的使用是不正確的: main()f(x[ ], int n) { int *p。 { f(p,n)。 … … } } 應注意,如果用指針變量作實參,必須先使指針變量有確定值,指向一個已定義的數(shù)組。 以上四種方法,實質(zhì)上都是地址的傳遞。其中 (1)(4)兩種只是形式上不同,實際上都是使用指針變量。 例 10個整數(shù)排序。 程序如下: main() { int p, i, a[10]。 p=a。 for(i=0。i< 10。i++) scanf(%D, p++)。 p=a。 Sort(p, 10)。 for(p=a, i=0。i< 10。i++) { printf(%D, *p)。p++。} } sort(int x[ ], int n) { int i, j, k, t。 for(i=0。i< n1。i++) { k=i。 for(j=i+1。j< n。j++) if(x[j]> x[k]) k=j。 if(k! =i) { t=x[i]。x[i]=x[k]。x[k]=t。} } } 為了便于理解,函數(shù) Sort中用數(shù)組名作為形參,用下標法引用形參數(shù)組元素,這樣的程序很容易看懂。當然也可以改用指針變量,這時 Sort函數(shù)的首部可以改為 sort(int x, int n) 其他不改,程序運行結(jié)果不變??梢钥吹?,即使在函數(shù) Sort中將 x定義為指針變量,在函數(shù)中仍可用x[i]、 x[k]這樣的形式表示數(shù)組元素,它就是 x+i和x+k所指的數(shù)組元素。它等價于 sort(int *x, int n) { int i, j, k, t。 for(i=0。i< n1。i++) { k=i。 for(j=i+1。j< n。j++) if(*(x+j)> *(x+k)) k=j。 if(k! =i) { t=*(x+i)。*(x+i)=*(x+k)。*(x+k)=t。 } } } 請讀者自己理解消化程序。 指向多維數(shù)組的指針和指針變量 用指針變量可以指向一維數(shù)組,也可以指向多維數(shù)組。但在概念上和使用上,多維數(shù)組的指針比一維數(shù)組的指針要復雜一些。 1. 多維數(shù)組的地址 為了說清楚多維數(shù)組的指針,先回顧一下多維數(shù)組的性質(zhì)。今以二維數(shù)組為例,設(shè)有一個二維數(shù)組 a,它有 3行 4列。 它的定義為 int a[3][4]={{1, 3, 5, 7},{ 9, 11, 13, 15},{ 17, 19, 21, 23}} 。 a是一個數(shù)組名。 a數(shù)組包含 3行,即 3個元素 : a[0],a[1], a[2]。而每一元素又是一個一維數(shù)組,它包含 4個元素 (即 4個列元素 ),例如, a[0]所代表的一維數(shù)組又包含 4個元素: a[0][0], a[0][1], a[0][2],a[0][3],見圖 。 圖 從二維數(shù)組的角度來看, a代表整個二維數(shù)組的首地址,也就是第 0行的首地址。 a+1代表第 1行的首地址。如果二維數(shù)組的首地址為 2022,則 a+1為 2022,因為第 0行有 4個整型數(shù)據(jù),因此 a+1的含義是 a[1]的地址,即 a+4 2=2022。 a+2代表第 2行的首地址,它的值是 2022,見圖 。 a[0]、 a[1]、 a[2]既然是一維數(shù)組名,而 C語言又規(guī)定了數(shù)組名代表數(shù)組的首地址,因此 a[0]代表第 0行一維數(shù)組中第 0列元素的地址,即 amp。a[0][0]。 a[1]的值是 amp。a[1][0], a[2]的值是 amp。a[2][0]。 圖 請考慮第 0行第 1列元素的地址怎么表示?可以用a[0]+1來表示,見圖 。此時“ a[0]+1”中的 1代表 1個列元素的字節(jié)數(shù),即 2個字節(jié)。今 a[0]的值是2022, a[0]+1的值是 2022(而不是 2022)。這是因為現(xiàn)在是在一維數(shù)組范圍內(nèi)討論問題的,正如有一個一維數(shù)組 x, x+1是其第 1列元素地址一樣。a[0]+0、 a[0]+ a[0]+ a[0]+3分別是 a[0][0]、a[0][1]、 a[0][2]、 a[0][3]的地址 (即 amp。a[0][0]、amp。a[0][1]、 amp。a圖 [0][2]、 amp。a[0][3])。前已述及,a[0] (a+0)等價, a[1] (a+1)等價, a[i]和*(a+i)等價。因此, a[0]+1和 (a+0)+1的值都是amp。a[0][1] (即圖 2022)。 a[1]+2和 *(a+1)+2的值都是 amp。a[1][2](即圖中的 2022)。請注意不要將 *(a+1)+2錯寫成 *(a+1+2),后者變成 *(a+3)了,相當于 a[3]。 進一步分析,欲得到 a[0][1]的值,用地址法怎么表示呢?既然 a[0]+1和 *(a+0)+1,是 a[0][1]的地址,那么, *(a[0]+1)就是 a[0][1]的值。同理,*(*(a+0)+1)或 *(*a+1)也是 a[0][1]的值。 *(a[i]+j)或*(*(a+i)+j)是 a[i][j]的值。務(wù)請記住 *(a+i)和 a[i]是等價的。 有必要對 a[i]的性質(zhì)作進一步說明。 a[i]從形式上看是 a數(shù)組中第 i個元素。如果 a是一維數(shù)組名,則 a[i]代表 a數(shù)組第 i個元素所占的內(nèi)存單元。 a[i]是有物理地址的,是占內(nèi)存單元的。但如果 a是二維數(shù)組,則 a[i]是代表一維數(shù)組名。 a[i]本身并不占 它也不存放 a數(shù)組中各個元素的值。它只是一個地址 (如同一個一維數(shù)組名 x并不占內(nèi)存單元而只代表地址一樣 )。 a、 a+i、 a[i]、 *(a+i)、 *(a+i)+j、a[i]+j都是地址。 *(a[i]+j)、 *(*(a+i)+j)是二維數(shù)組元素 a[i][j]的值。有些讀者可能不理解為什么 a+1和 *(a+1)都是 2022呢?他們想“ a+1的值和 a+1的地址怎么都是一樣的呢”?的確,二維數(shù)組中有些概念比較復雜難懂,要反復思考。首先說明,a+1是地址 (指向第 1行首地址 ),而 *(a+1)并不是“ a+1單元的內(nèi)容 (值 )”,因為 a+1并不是一個實際變量,也就談不上它的內(nèi)容。 *(a+1)就是 a[1],而a[1]是一維數(shù)組名,所以也是地址。以上各種形式都是地址計算的不同表示。 為了說明這個容易搞混的問題,舉一個日常生活中的例子來說明。有一個排,下設(shè) 3個班,每班有 10名戰(zhàn)士。規(guī)定排長只管理到班,班長管理戰(zhàn)士。在排長眼里只有第 0、 2班 (為與 C語言中數(shù)組下標一致,假定班號也從 0開始 )。排長從第 0班的起始位置走到第 1班的起始位置,看來只走了一步,但實際上它跳過了 10個戰(zhàn)士。這相當于 a+1(見圖)。為了找到某一班內(nèi)某一個戰(zhàn)士,必須給兩個參數(shù),即第 i班第 j個戰(zhàn)士,先找到第 i班,然后由該班班長在本班范圍內(nèi)找第 j個戰(zhàn)士。這個戰(zhàn)士的位置就是 a[i]+j(這是一個地址 )。開始時班長面對第 0個戰(zhàn)士。注意,排長和班長的初始位置是相同的 (如圖 a和 a[0]都是 2022)。但它們的“指向”是不同的。 排長“指向”班,他走一步就跳過 1個班,而班長“指向”戰(zhàn)士,走一步只是指向下一個戰(zhàn)士??梢钥吹脚砰L是“宏觀管理”,只管班,在圖 中是控制縱向,班長則是“微觀管理”,管理到戰(zhàn)士,在圖上是控制橫向。如果要找第 1班第 2個戰(zhàn)士,則先由排長找到第 1班的班長,然后,由班長在本班范圍內(nèi)找到第 2個戰(zhàn)士。二維數(shù)組 a相當于排長,每一行 (即一維數(shù)組 a[0] 、 a[1]、 a[2])相當于班長,每一行中的元素 (如 a[1][2])相當于戰(zhàn)士。a+1與 a[0]+1是不同的, a+1是第 1行的首地址,a+1指向第 1行 (相當于排長走到第 1班的開頭 ),而*(a+1)或 a[1]或 a[1]+0都指向第 1行第 0列元素 (相當于第 1班第 0個戰(zhàn)士 ),二者地址雖相同,但含義不同了。前者是“縱向控制”,后者是“橫向控制”。 a,a[0]的值雖然相同 (等于 2022),但是由于指針的類型不同 (a是指向一維數(shù)組, a[0]指向 a[0][0]元素 )因此,對這些指針進行加 1的運算,得到的結(jié)果是不同的。 請記住,二維數(shù)組名 (如 a)是指向行的。因此 a+1中的“ 1” 代表一行中全部元素所占的字節(jié)數(shù)(圖 8個字節(jié) )。一維數(shù)組名 (如 a[0],a[1])是指向列元素的。 a[0]+1中的“ 1” 代表一個元素所占的字節(jié)數(shù) (圖 2個字節(jié) )。在行指針前面加一個 *,就轉(zhuǎn)換為列指針。例如, a和a+1是行指針,在它們前面加一個 *就是 *a和*(a+1) ,它們就成為列指針,分別指向 a數(shù)組 0行 0列的元素和 1行 0列的元素 。反之,在列指針前面加 amp。,就成為行指針。例如 a[0] 是指向 0行 0列元素的列指針, 在它前面加一個 amp。,得 amp。a[0] ,由于 a[0] 與 *(a+0) 等價,因此 amp。a[0] 與 amp。*a等價,也就是與 a等價,它指向二維數(shù)組的 0行。 圖 圖 不要把 amp。a[i]簡單地理解為 a[i]單元的物理地址 ,因為并不存在 a[i]這樣一個變量。它只是一種地址的計算方法 ,能得到第 i行的首地址 , amp。a[i]和 a[i]的值是一樣的 , 但它們的含義是不同的。 amp。a[i]或 a+i指向行 ,而 a[i] (a+i)指向列。當列下標 j為 0時 ,amp。a[i]和 a[i](即 a[i]+j)值相等 ,即它們具有同一地址值。(a+i)只是 a[i]的另一種表示形式 ,不要簡單地認為是“ a+i所指單元中的內(nèi)容”。在一維數(shù)組中 a+i所指向的是一個數(shù)組元素的存儲單元 ,它有具體值 ,上述說法是正確的。而對二維數(shù)組 ,a+i不是指向具體存儲單元而指向行。在二維數(shù)組中 ,a+i=a[i]=(a+i)=amp。a[i]=amp。a[i][0],即它們的地址值是相等的。請讀者仔細琢磨其概念。請分析下面的程序 ,以加深對上面敘述的理解。 例 。 define FORMAT %D, %D\n main() { int a[3][4]={ 1, 3, 5, 7, 9, 11, 13, 15,17, 19, 21, 23} 。 printf(FORMAT, a, *a)。 printf(FORMAT, a[0], *(a+0))。 printf(FORMAT, amp。a[0], amp。a[0][0])。 printf(FORMAT, a[1], a+1)。 printf(FORMAT, amp。a[1][0], *(a+1)+0)。 printf(FORMAT, a[2], *(a+2))。 printf(FORMAT, amp。a[2], a+2)。 printf(FORMAT, a[1][0], *(*(a+1)+0))。 } 運行結(jié)果如下: 158, 158(第 0行首地址和 0行 0列元素地址 ) 158, 158(0行 0列元素地址 ) 158, 158(0行首地址和 0行 0元素地址 ) 166, 166(1行 0列元素地址和 1行首地址 ) 166, 166(1行 0列元素地址 ) 174, 174(2行 0列元素地址 ) 174, 174(第 2行首地址 ) 9, 9(1行 0列元素的值 ) 請注意, a是二維數(shù)組名,代表數(shù)組首地址,但是不能企圖用 *a來得到 a[0][0]的值。 *a相當于 *(a+0),即 a[0],它是第 0行地址 (本次程序運行時輸出 a、a[0]和 *a的值都是 158,都是地址。請注意:每次編譯分配的地址是不同的 )。 a是指向一維數(shù)組的指針,可理解為行指針, *a是指向列元素的指針,可理解為列指針,指向 0行 0列元素, **a是 0行 0列元素的值。同樣, a+1指向第 1行首地址,但也不能企圖用 *(a+1)得到 a[1][0]的值,
點擊復制文檔內(nèi)容
教學課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1