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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值