Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用指针对数组进行排序,不使用任何索引变量_C_Arrays_Sorting_Pointers - Fatal编程技术网

C 使用指针对数组进行排序,不使用任何索引变量

C 使用指针对数组进行排序,不使用任何索引变量,c,arrays,sorting,pointers,C,Arrays,Sorting,Pointers,我尝试对数组进行排序,使用指针,也不使用索引变量 void sort(int *a,int n) { int *temp; *temp=0; int *b=a; for(;a<a+n-1;a+=1) { for(b=a+1;b<b+n;b+=1) { if(*a>*b) { *temp=*a; *a=*b; *b=*

我尝试对数组进行排序,使用指针,也不使用索引变量

void sort(int *a,int n)
{
  int *temp;
  *temp=0;
  int *b=a;
  for(;a<a+n-1;a+=1)
    {
      for(b=a+1;b<b+n;b+=1)
        {
          if(*a>*b)
          {
            *temp=*a;
            *a=*b;
            *b=*temp;
          }
        }
    }
}
void排序(int*a,int-n)
{
内部*温度;
*温度=0;
int*b=a;
对于(;a
a
不允许:您尚未为
temp

或使用:

int temp;
或者

 int *temp;
   temp=malloc(1*sizeof(*temp)); // The dirty way.

这两行是错误的:

int *temp;
*temp=0;
在第一行中,您声明了一个指针变量。这个变量指向某个地方,但只要您不给这个变量赋值,您就无法知道它指向哪里

然后,在第二行中,你说:无论
temp
指向哪里,都在该内存单元中写入一个零。因此程序写入一个随机未知地址

在您的情况下,
temp
不应该是指针,因为您以后需要它来存储
int

作为一般规则,您不应更改函数的参数,在本例中为
a
。相反,应再创建一个局部变量。这将防止在比较
b综合版时代码中出现另一个错误(UB=未定义行为=错误和错误):

这就留下了无限循环:即使在遍历数组时,也需要记住数组的结束位置:

  int *begin = a;
  int *end = a + n; // one-past-the-end for a half-open interval
  for (int *i = begin; i < end; ++i) {
int*begin=a;
int*end=a+n;//在半个开放间隔内,超过端点一次
for(int*i=begin;i

请注意,您需要对嵌套循环进行等效更改,并且在元素交换中,
*temp
应该是
temp

好的,我做了一个更改。创建了一个变量,并将指向该变量的指针指定给了temp。仍然收到相同的错误。p,只需使用
int temp=0;
-它不是索引变量,so你不需要为了你的练习把它改成指针该死,这是一个更简单的方法。但我仍然收到一个错误?@sjsam我不知道malloc做什么。我刚开始学习指针,这是一个练习question@buggenerator:仅分配4字节内存用于存储和整数值。但不要在此处使用。它使代码变脏是的。这是真的。但是仍然没有得到你所暗示的?循环条件始终为真的循环是一个无限循环-也就是说,你从数组的末尾走出来,继续走,排序你能到达的所有内存,直到程序崩溃。如果你在旧的(预保护的内存)上尝试这个方法操作系统,您可能必须关闭机器电源才能停止它。我们可能会发疯,使用超过一个字符长的变量名。您知道,如果我们愿意的话。注意:两个版本都只使用指针。您从不使用数组进行任何访问。@Olaf是的。每当您将数组传递给函数时,它实际上会传递指向第一个元素的指针数组的。对吗?回滚。得到答案后,您不能更改问题。只需添加澄清或在问题后添加注释。@buggenerator:不仅如此。
int a[10];a[1];
:这里
a[1]
已经使用了指针。(我不会进一步说明,只需自己做一些研究)好的,我现在知道了,让我知道我解释的是正确的,在上面的程序中,我正在增加
a
的值,并且我正在检查
yes-第一轮,
a+n
与我的
end
相同。但是,第二轮,
end
保持不变(在数组的末尾),而
a+n
自从我们增加
a
以来一直在移动。除非你手动操作,否则一开始不会取一次值-整个表达式
(a
每次都会得到评估。是的@Roland Illig。这是一个新手错误,我理解我在这方面做错了什么
int *temp;
*temp=0;
void sort(int *a,int n)
{
  int *temp;
  *temp=0;  // UB: assignment to uninitialized pointer
  int *b=a;
  for(;a<a+n-1;a+=1) // UB: a<a+n-1 is always true so this is infinite
    {
void sort(int *a,int n)
{
  int temp=0;  // not an index variable, doesn't have to change to pointer
  int *begin = a;
  int *end = a + n; // one-past-the-end for a half-open interval
  for (int *i = begin; i < end; ++i) {