c - 仅使用指针对整数数组进行排序时的 "for"循环

标签 c arrays pointers

我正在尝试弄清楚“for”循环如何在仅使用指针而不使用索引对整数数组进行排序的函数中工作。以下函数完成了任务,但我不明白语句“aptr1 < a + n - 1”中比较的是什么值。我知道这个语句用于滚动数组并且 a+n-1 相当于 &(a[n-1]) 指向数组中的特定值,但是比较数组中包含的值如何完成像索引那样滚动数组的任务?感谢您的帮助!

btw- 在函数参数中 *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;  
       }  
}  

最佳答案

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;  
       }  

虽然代码不正确,因为您可能没有取消引用表达式 ( a + n ) 但是它有助于理解原始函数中使用的表达式。

请注意,如果 n 等于 0,则由于表达式 a + n - 1,原始函数不正确。

关于c - 仅使用指针对整数数组进行排序时的 "for"循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46738612/

相关文章:

c++ - 从指向字符串的指针获取一个字符

c++ - 在 64 位 Windows 上 long 的位大小是多少?

c - 接收数据时触发函数的套接字

c - EXC_BAD_ACCESS 用 fscanf 加载 int

c - 流程的完整状态

arrays - 如果使用 IntroSort 算法,Swift Array.sort() 如何比元组更快地对整数进行排序? Swift 对整数的排序方式不同吗?

python - 使用 np.load 和 np.save 从磁盘加载数组和字典后使用它们

arrays - 自定义字符串排序: How do I place these strings in an array in this particular order

c - C语言给字符串加一个整数,如何理解结果?

c - C 程序中的 sbrk 函数和指针