C++程序中,将N位数组循环右移K次,下面程序运行不对,哪里错了

#include<iostream>usingnamespacestd;//循环右移:将N位数组循环右移K次voidRightShift(int*arr,intN,int... #include <iostream>
using namespace std;
//循环右移:将N位数组循环右移K次
void RightShift(int *arr, int N, int K)
{
while (K--)
{
int t = arr[N - 1];
for (int i = N - 1; i > 0; i--)
{
arr[i] = arr[i - 1];
}
arr[0] = t;
}

}
int main()
{
int *arr=(int*)("abcd1234");
RightShift(arr, 4, 4);
cout << &arr << endl;
return 0;
}
展开
 我来答
leesunshine007
2015-03-01 · TA获得超过1172个赞
知道小有建树答主
回答量:701
采纳率:0%
帮助的人:436万
展开全部

1. 因为 RightShift 中 要操作 传入的数组, 所以arr 要定义成数组(在栈上) 或者 malloc(在堆上).

而不能 const char * arr = "abcd1234"; 它是在const 区. 不能修改.


2. 第二点, 我觉得main函数中的 强制类型 转换 没有什么意义. 

把 char * 转 成 int * ? 一次想右移4个字节???

                                  

 

 #include <iostream>                                                               
   using namespace std;                                                              
                                                                                     
   //循环右移:将N位数组循环右移K次                                                  
   void RightShift(char * arr, int N, int K)                                         
   {                                                                                 
       while (K--)                                                                   
       {                                                                             
           int t = arr[N - 1];                                                       
           for (int i = N - 1; i > 0; i--)                                           
           {                                                                         
               arr[i] = arr[i - 1];                                                  
           }                                                                         
           arr[0] = t;                                                               
       }                                                                             
                                                                                     
   }                                                                                 
   int main()                                                                        
   {                                                                                 
       // const char * arr = "abcd1234"; // 不能这么做, 因为 arr 不能修改            
       char arr[] = "abcd1234";                                                      
                                                                                     
       RightShift(arr, 8, 5);                                                              
       cout << arr << endl; // 不能用 &                                              
       return 0;                                                                     
   }
追问
RightShift函数在定义时arr为指针,但在主函数中arr不是数组吗?
追答
int *arr=(int*)("abcd1234");

这样定义指针的话, 是不能对 修改 arr的. 因为它是储存在常量区. 不是在栈上.

你的 RightShift 函数 里不是要对它修改嘛, 所以要改成 定义成数组.

int arr[] = {1, 2, 3, 4, 5};

像上面这样 才对. 

Tnt丨小轩
2015-03-01 · 超过14用户采纳过TA的回答
知道答主
回答量:21
采纳率:0%
帮助的人:21.1万
展开全部
RightShift(arr, 4, 4) 这个函数是要移动一个int型的数组,你这里入参申明的是一个int型的指针,int *arr=(int*)("abcd1234"); 得到的是一个int型变量的指针,而不是一个数组,因为你想用一个指针void RightShift(int *arr, int N, int K) int *arr作为函数入参,数组的名称代表的数组的首元素地址,实际上却给了一个int型变量指针,所以编译器应该是不会报错的。 循环右移的函数是绝对ok的, 可以加上一个入参合法性校验判断。
if(sizof(arr) / sizeof(int) != N)
{
cout<<"入参错误"<<endl;
return;
}
main中使用测试一下函数的方法:

int arr[4] = {1,2,3,4};
RightShift(arr, 4, 3);

然后看下arr的结果应该是ok的。
追问
感谢,按你的说法测试时正确的,多谢!  如果我在主程序测试中也用指针来测试该怎么做啊?就是把字符串abcd1234循环右移4位,对指针赋值并输出移动后的结果。菜鸟求助~~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式