我做了一个简单的例程来排序一个数组,接受一个参数数组作为参数,问题是当我比较值时,数组[i]在调试器中显示正确的值但是数组[i + 1]显示了伪造价值...我猜是一个指针问题,但我无法弄清楚我做错了什么。
以下是代码:
typedef int vector[10];
void task1(vector * param)
{
bool ordered = false;
while (!(ordered))
{
int tmp = 0;
ordered = true;
for (int i = 0; i < 9 ; i++)
{
if (*param[i] > *param[i+1])
{
tmp = *param[i];
*param[i] = *param[i + 1];
*param[i + 1] = tmp;
ordered = false;
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
vector tavi = {10,88,77,192,7,27,82,1,882,13};
task1(&tavi);
for (int i = 0 ; i < 10 ; i ++)
printf("%d ",tavi[i]);
_getch();
return 0;
}
答案 0 :(得分:4)
下标 - 运算符([]
)的优先级高于derefence运算符(*
),因此*param[i]
实际上是*(param[i])
。这意味着,您首先转到param
的第i个元素,然后取消引用它 - 这不是您想要的(param
不是指向数组的指针)。你想取消引用param
和然后转到第i个元素 - 这将是(*param)[i]
。
答案 1 :(得分:2)
首先:你为什么要自己编写排序(更不用说bubblesort不是很快)。 那么为什么不简单地使用
std::sort(tavi, tavi + 10, std::less<int>());
当然,如果你有C ++ 11或者提升它也是一个好主意,忘记c样式数组并改用std::array
或boost::array
:
std::array<int, 10> tavi = {10,88,77,192,7,27,82,1,882,13};
std::sort(tavi.begin(), tavi.end(), std::less<int>());
for (int i = 0 ; i < tavi.size(); i ++)
std::cout<<tavi[i]<<" ";
如果您真的想这样做,*param[i]
与*(param[i])
相同,而您想使用(*param)[i]
。
答案 2 :(得分:1)
vector
是int[10]
类型。因此,vector* is type int(*)[10]
。也就是说,指向10个int的数组的指针。因此,param[i]
和param[i+1]
之间的距离为sizeof(int) * 10
执行此操作时:
if (*param[i] > *param[i+1])
您正在将一个10个整数的数组与下一个10个整数的数组进行比较。我希望这不会编译,遗憾的是,发生的是数组被隐式转换为指向其第一个元素的指针。因为我&lt; i + 1,上述比较永远不会成真。