日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【C语言练习】【指针】定义一个函数move,实现将长度为n、名为a的序列中,各元素依次顺序循环,右移m个位置

發布時間:2024/8/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言练习】【指针】定义一个函数move,实现将长度为n、名为a的序列中,各元素依次顺序循环,右移m个位置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

下列函數move的功能是:實現將長度為n、名為a的序列中,各元素依次順序循環,右移m個位置。
例如:對于序列a=(1,3,5,7,9,11),若m=2,則循環右移后的結果為a=(9,11,1,3,5,7)。
閱讀下列程序,請補充括號①和②位置的內容:

int move(int *a, int n, int m) {int *p, k, temp;for ( k = 1; k <= m; k++){temp = ();for ( p = a +n -1; (); p--){*p = *(p - 1); }*a = temp;} }

一、解題思路

1、首先,我們看到move函數是一個帶參函數,定義了三個整形變量:指針變量a指向序列a的首地址、n為序列的長度、m為控制整體循環的上限次數;
2、然后,在函數體內,又定義了三個變量:指針變量p用來實現序列地址的移動從而達到對序列的地址進行遍歷的效果、變量k用來控制整體循環的遍歷、變量temp暫時不清楚其功能

二、解題步驟

1、首先,我們觀察到最外層循環是一個標準的用for循環實現遍歷,下限是k=1,上限是k=m,根據題意可知:
若m=1,則循環1次,a=(1,3,5,7,9,11)就變成了a=(11,1,3,5,7,9)
若m=2,則循環2次,接著上一次循環,a=(11,1,3,5,7,9)就變成了a=(9,11,1,3,5,7)
…以此類推
2、其次,我們觀察內層循環里的內容。指針變量p = a +n -1,這個表達式的含義為指針p指向了序列a的最后一個元素的地址的位置,理由如下圖所示:

3、然后,再根據后面的p- -我們便可以確定,第二個for循環是根據指針p所指的地址,從后往前遍歷的
4、接著,我們看到了*p = *(p - 1)。這個表達式的含義如下圖所示:

4、由上圖可知,也就是說,第n-1個元素的值代替了第n個元素的值,相當于是第n-1個元素向右移動了一位,取代了第n個元素的位置。
5、此時,我們便發現一個問題:當第n-1個元素代替了第n個元素時,第n個元素去哪里了呢?完全消失是肯定不可以的,因為題干中最后一個元素是循環到了序列的首部,所以說最后一位的元素一定要另外找一個內存保存起來,方便之后調用這個內存。
6、帶著上面的問題,我們去到源碼的位置,發現temp應該就是另外開辟的內存,再根據最后一行的那句* a = temp便可以確定,temp的功能就是為了保存序列的最后一個元素。由于* a 代表的是首地址的元素的值,那么temp應該代表的是最后一位元素的地址所反映出來的元素的值。由于最后一位元素地址的表達式為a +n -1,那么其所代表的值便為*(a +n -1)。所以,①的位置填:* (a +n -1)
7、在用指針p對序列進行遍歷時,需要有限制條件:指針p所指的地址不能與首地址重合,即p所指向的地址不能與a所指向的首地址重合,即p != a。所以,②的位置填:p != a
8、綜上所述:①的位置填:*(a +n -1) ②的位置填:p != a

三、補全代碼

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;} }

總結

1、要明確指針所代表的含義,*p代表的含義有:
①p是一個指針變量
②p代表的是所指向元素的地址
③ *p代表的是指針p所指位置的元素的值
2、任意一個元素的地址的值是無法確定的,我們可以確定的是其地址所在的位置。地址所代表的是元素的位置,不是一個具體的值

總結

以上是生活随笔為你收集整理的【C语言练习】【指针】定义一个函数move,实现将长度为n、名为a的序列中,各元素依次顺序循环,右移m个位置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。