【C语言练习】【指针】定义一个函数move,实现将长度为n、名为a的序列中,各元素依次顺序循环,右移m个位置
題目
下列函數(shù)move的功能是:實(shí)現(xiàn)將長(zhǎng)度為n、名為a的序列中,各元素依次順序循環(huán),右移m個(gè)位置。
例如:對(duì)于序列a=(1,3,5,7,9,11),若m=2,則循環(huán)右移后的結(jié)果為a=(9,11,1,3,5,7)。
閱讀下列程序,請(qǐng)補(bǔ)充括號(hào)①和②位置的內(nèi)容:
一、解題思路
1、首先,我們看到move函數(shù)是一個(gè)帶參函數(shù),定義了三個(gè)整形變量:指針變量a指向序列a的首地址、n為序列的長(zhǎng)度、m為控制整體循環(huán)的上限次數(shù);
2、然后,在函數(shù)體內(nèi),又定義了三個(gè)變量:指針變量p用來(lái)實(shí)現(xiàn)序列地址的移動(dòng)從而達(dá)到對(duì)序列的地址進(jìn)行遍歷的效果、變量k用來(lái)控制整體循環(huán)的遍歷、變量temp暫時(shí)不清楚其功能
二、解題步驟
1、首先,我們觀察到最外層循環(huán)是一個(gè)標(biāo)準(zhǔn)的用for循環(huán)實(shí)現(xiàn)遍歷,下限是k=1,上限是k=m,根據(jù)題意可知:
若m=1,則循環(huán)1次,a=(1,3,5,7,9,11)就變成了a=(11,1,3,5,7,9)
若m=2,則循環(huán)2次,接著上一次循環(huán),a=(11,1,3,5,7,9)就變成了a=(9,11,1,3,5,7)
…以此類推
2、其次,我們觀察內(nèi)層循環(huán)里的內(nèi)容。指針變量p = a +n -1,這個(gè)表達(dá)式的含義為指針p指向了序列a的最后一個(gè)元素的地址的位置,理由如下圖所示:
3、然后,再根據(jù)后面的p- -我們便可以確定,第二個(gè)for循環(huán)是根據(jù)指針p所指的地址,從后往前遍歷的
4、接著,我們看到了*p = *(p - 1)。這個(gè)表達(dá)式的含義如下圖所示:
4、由上圖可知,也就是說(shuō),第n-1個(gè)元素的值代替了第n個(gè)元素的值,相當(dāng)于是第n-1個(gè)元素向右移動(dòng)了一位,取代了第n個(gè)元素的位置。
5、此時(shí),我們便發(fā)現(xiàn)一個(gè)問(wèn)題:當(dāng)?shù)趎-1個(gè)元素代替了第n個(gè)元素時(shí),第n個(gè)元素去哪里了呢?完全消失是肯定不可以的,因?yàn)轭}干中最后一個(gè)元素是循環(huán)到了序列的首部,所以說(shuō)最后一位的元素一定要另外找一個(gè)內(nèi)存保存起來(lái),方便之后調(diào)用這個(gè)內(nèi)存。
6、帶著上面的問(wèn)題,我們?nèi)サ皆创a的位置,發(fā)現(xiàn)temp應(yīng)該就是另外開(kāi)辟的內(nèi)存,再根據(jù)最后一行的那句* a = temp便可以確定,temp的功能就是為了保存序列的最后一個(gè)元素。由于* a 代表的是首地址的元素的值,那么temp應(yīng)該代表的是最后一位元素的地址所反映出來(lái)的元素的值。由于最后一位元素地址的表達(dá)式為a +n -1,那么其所代表的值便為*(a +n -1)。所以,①的位置填:* (a +n -1)
7、在用指針p對(duì)序列進(jìn)行遍歷時(shí),需要有限制條件:指針p所指的地址不能與首地址重合,即p所指向的地址不能與a所指向的首地址重合,即p != a。所以,②的位置填:p != a
8、綜上所述:①的位置填:*(a +n -1) ②的位置填:p != a
三、補(bǔ)全代碼
int move(int *a, int n, int m) {int *p, k, temp;for ( k = 1; k <= m; k++){temp = *(a + n - 1);for ( p = a +n -1; p != a; p--){*p = *(p - 1); }*a = temp;} }總結(jié)
1、要明確指針?biāo)淼暮x,*p代表的含義有:
①p是一個(gè)指針變量
②p代表的是所指向元素的地址
③ *p代表的是指針p所指位置的元素的值
2、任意一個(gè)元素的地址的值是無(wú)法確定的,我們可以確定的是其地址所在的位置。地址所代表的是元素的位置,不是一個(gè)具體的值
總結(jié)
以上是生活随笔為你收集整理的【C语言练习】【指针】定义一个函数move,实现将长度为n、名为a的序列中,各元素依次顺序循环,右移m个位置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 亚马逊推出基于 RFID 的新型 Jus
- 下一篇: 山河旅探怎么指证小娥是凶手