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;
} 展开
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;
} 展开
2个回答
展开全部
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};
像上面这样 才对.
展开全部
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的。
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位,对指针赋值并输出移动后的结果。菜鸟求助~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询