栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【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、任意一个元素的地址的值是无法确定的,我们可以确定的是其地址所在的位置。地址所代表的是元素的位置,不是一个具体的值

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429647.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号