题目

下列函数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个位置相关推荐

  1. 【C】函数指针——定义一个函数指针数组

    #include<stdio.h> void function1(int); void function2(int); void function3(int);int main(){voi ...

  2. 怎样设置一个函数C语言,C语言中怎样编写一个函数 如何在C语言中定义一个函数?...

    如何在C语言中定义一个函数?小编很想在你面前流泪最后却还是选择装作打个哈欠 为什么小编怎么定义函数都不正确呢? 总是说小编 表达语法错误在main函数中 小编们可以在头文件与main函数之间定义,并编 ...

  3. python使用del保留字定义一个函数-函数和代码复用 --Python

    1.关于递归函数的描述,以下选项中正确的是 A.包含一个循环结构 B.函数比较复杂 C.函数内部包含对本函数的再次调用 D.函数名称作为返回值 答案:D 答案解析:递归函数是指函数内部包含对本函数的再 ...

  4. C语言:定义一个函数max_min,求一组数据的最大值和最小值. 在主函数中输入n和n个数据,调用max_min函数求出最大最小值,然后在主函数中输出这n个数的最大值和最小值。(要求使用指针做)

    [问题描述]定义一个函数max_min,求一组数据的最大值和最小值. 在主函数中输入n和n个数据,调用max_min函数求出最大最小值,然后在主函数中输出这n个数的最大值和最小值.(要求使用指针做) ...

  5. c语言 返回函数是结构体指针变量,一个函数返回值为指向结构体的指针的问题...

    一个函数返回值为指向结构体的指针的问题 #include #include struct student { int num; char name[10]; struct student *next; ...

  6. C++如何定义一个函数指针

    首先给出一个函数 int function(int a) {return a; } 一.定义一个函数指针 int (*fun)(int a); // 赋值 fun = function; // 使用 ...

  7. C语言: 定义一个函数int isprime(int n),用来判别一个正整数n是否为素数,若为素数函数返回值为1,否则为0。在主函数中输入一个整数x,调用函数isprime(x)来判断这个整数x是

    原题: 定义一个函数int isprime(int n),用来判别一个正整数n是否为素数,若为素数函数返回值为1,否则为0.在主函数中输入一个整数x,调用函数isprime(x)来判断这个整数x是不是 ...

  8. C语言: 定义一个函数int isprime(int n),用来判别一个正整数n是否为素数。在主函数中输入两个正整数m和n(m>=1,n>m),统计并输出m和n之间的素数的个数以及这些素数的和。

    原题: 定义一个函数int isprime(int n),用来判别一个正整数n是否为素数.在主函数中输入两个正整数m和n(m>=1,n>m),统计并输出m和n之间的素数的个数以及这些素数的 ...

  9. C语言:使用指针,封装一个函数, // 使输入的奇数从小到大排列,奇数排列完毕之后,再把偶数从大到小进行排列, // 最终输出整个

    // 使用指针,封装一个函数, // 使输入的奇数从小到大排列,奇数排列完毕之后,再把偶数从大到小进行排列, // 最终输出整个 #include <stdio.h> void Jopai ...

最新文章

  1. Print All JVM Flags
  2. 【原创】sql:慎用【数字字段1 - 数字字段2】这样的sql(10-null = null)mysql
  3. Azkaban启动与激活命令
  4. 上拉加载更多后台数据_6-7【微信小程序全栈开发课程】记录页面(七)--分页加载记录数据...
  5. mysql允许所有用户连接_Mysql权限控制 - 允许用户远程连接
  6. 虚拟化部署的四大安全问题
  7. Apache Server Status主机状态查看
  8. 前端----CSS层叠样式表
  9. php 正则预搜索?=
  10. 在白宫,郎朗为什么选择了《我的祖国》
  11. java opencv 计算滑块横移距离
  12. android系统裁剪方法
  13. UFS的Command Queue
  14. python cls方法_python – cls()函数在类方法中做了什么?
  15. Vue实现生成二维码
  16. 测试路由器信号软件,无线信号测试环境及测试方法介绍
  17. 我的大学六年 郭天祥
  18. 陈曦北理工电子工程系_陈曦 -清华大学自动化系
  19. Django中的url路由机制------学习mooc中《Python云端系统开发入门》
  20. Jiangsheng的CSDN Digest(May 15, 2006)

热门文章

  1. android多渠道 依赖,android 不同渠道 添加不同依赖jar 使用不同代码
  2. java 调用cpp_java jni 调用cpp文件中的方法 | 学步园
  3. java oracle 图片_JAVA读取Oracle中的blob图片字段并显示
  4. opencv怎么2个摄像头_最后2个月,怎么做能够快速提分?
  5. python相比于excel的优势_都在讨论Python能否取代Excel,那有没有人想到它
  6. 总分第一!阿里云数据库应用迁移解决方案通过信通院首批最高级评测
  7. 上海市新能源汽车数据平台引入阿里云Lindorm数据库,成本下降20%
  8. 从零点五开始用Unity做半个2D战棋小游戏(十)
  9. 用 Unity 探究 2D 游戏的打击感
  10. SQL中除数为0处理情况演示