Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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/3/arrays/14.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_Pointers - Fatal编程技术网

C ";至于;仅使用指针对整数数组排序时循环

C ";至于;仅使用指针对整数数组排序时循环,c,arrays,pointers,C,Arrays,Pointers,我试图找出“for”循环是如何在一个函数中工作的,该函数使用的是只使用指针,而不是索引对整数数组进行排序。下面的函数完成了任务,但我不知道在语句“aptr1

我试图找出“for”循环是如何在一个函数中工作的,该函数使用的是只使用指针,而不是索引对整数数组进行排序。下面的函数完成了任务,但我不知道在语句“aptr1 顺便说一句,在函数参数*中,a指向未排序的整数数组,n表示数组中的整数数

void sort (int  *a, int  n)  
{  
    int  *aptr1, *aptr2, temp;  

for ( aptr1 = a;  aptr1 < a + n - 1;  ++aptr1 )  
     for ( aptr2 = aptr1 + 1;  aptr2 < a + n;  ++aptr2 )  
         if ( *aptr1 > *aptr2 ) {  
            temp = *aptr1;  
            *aptr1 = *aptr2;  
            *aptr2 = temp;  
       }  
}  
void排序(int*a,int-n)
{  
int*aptr1,*aptr2,温度;
对于(aptr1=a;aptr1*aptr2){
温度=*aptr1;
*aptr1=*aptr2;
*aptr2=温度;
}  
}  

a+n-1
不等同于
(*a+n-1)
。它相当于
&a[n-1]

要理解循环,只需按照以下方式重写它们

for ( aptr1 = &a[0];  aptr1 < &a[n - 1];  ++aptr1 )  
     for ( aptr2 = &aptr1[1];  aptr2 < &a[n];  ++aptr2 )  
         if ( *aptr1 > *aptr2 ) {  
            temp = *aptr1;  
            *aptr1 = *aptr2;  
            *aptr2 = temp;  
       }  
for(aptr1=&a[0];aptr1<&a[n-1];++aptr1)
对于(aptr2=&aptr1[1];aptr2<&a[n];++aptr2)
如果(*aptr1>*aptr2){
温度=*aptr1;
*aptr1=*aptr2;
*aptr2=温度;
}  
虽然代码不正确,因为您可能无法取消引用表达式
(a+n)
,但它有助于理解原始函数中使用的表达式


考虑到如果n等于0,则原始函数不正确,因为表达式
a+n-1

a+n-1
是指向最后一个元素的指针。其余的可以从中推断出来。如果数组的最后一个元素的值是2,而指向数组第一个元素的aptr的值是3,那么aptr不小于a+n-1的值,并且for循环退出了,对吗?通常,如果您想了解如何使用指针而不是索引执行算法,看看C++是如何做的,因为C++迭代器的作用就像指针。“我明白……<代码> A+N-1 < /Cord>相当于<代码>(*A+N-1)< /C>。不。它相当于
&(a[n-1])
(*a+n-1)
相当于
a[0]+n-1
,而
*(a+n-1)
(如果你的意思是)相当于
a[n-1]
。请注意在所有这些情况下指针、地址和值之间的差异。感谢您的澄清!这是否意味着语句中比较的值是地址值?我尝试显示地址值,但这些值与保持for循环运行所需的值不一致。i、 e.for循环中的第一组地址值不满足以下要求:aptr1是实际执行的(非法)解引用,或者编译器是否允许将其解释为(合法)指针算术运算,从而产生有效指针(a+n)?@Bob_uuu?在我看来,在C标准中有一个有争议的描述。一方面,有这样一句话:“如果操作数是一元*运算符的结果,则该运算符和&运算符都不会被计算,结果就像两者都被省略一样,除非对运算符的约束仍然适用。”。这就是关于约束的说法。@Bob另一方面,也写了“类似地,如果操作数是[]运算符的结果,则[]所隐含的&运算符和一元数*都不会被计算,结果就好像&运算符被删除,[]运算符被更改为+运算符一样。”虽然有“微笑”这个词,但没有提到约束。对不起,弗拉德,在鲍勃澄清了我犯的错误后,我编辑了我的问题。我仍然不明白在语句aptr1<&a[n-1]中比较的是什么值。@NotAWizard有比较指针,它们存储的地址就是这些指针。指针aptr1可以指向数组的任何元素,但数组的最后一个元素除外。实际上,数组中所有元素的地址都小于最后一个元素的地址。