繁体   English   中英

qsort如何修改指向字符串的指针?

[英]How qsort modify pointer to string?

glibc中qsort的实现通过交换函数修改指针数组,如下所示:

#define SWAP(a, b, size)                              \
  do                                          \
    {                                         \
      register size_t __size = (size);                        \
      register char *__a = (a), *__b = (b);                   \
      do                                      \
    {                                     \
      char __tmp = *__a;                              \
      *__a++ = *__b;                              \
      *__b++ = __tmp;                             \
    } while (--__size > 0);                           \
    } while (0)

...在这里查看完整代码...

说,我已经这样声明了指针数组:(我知道不能修改指针字符串)。

  char *a[] = {"one", "two", "three", "four"},
         *lo = (char*)a,
         *hi = &lo[2];
    SWAP(lo, hi, 4);   // Doesn't work.

简而言之,我想知道qsort如何对字符串指针数组进行排序。 据我所知,指针数组无法修改。 它只能指向其他指针。

您对lohi初始化不正确。 他们应该是:

    char *lo = (char*)&a[0],
         *hi = (char*)&a[2];

这将交换lohi的值。 完整代码:

#include <stdio.h>

#define SWAP(a, b, size)                                \
    do                                                  \
        {                                               \
            register size_t __size = (size);            \
            register char *__a = (a), *__b = (b);       \
            do                                          \
                {                                       \
                    char __tmp = *__a;                  \
                    *__a++ = *__b;                      \
                    *__b++ = __tmp;                     \
                } while (--__size > 0);                 \
        } while (0)

int main(int argc, char *argv[]) {
    char *a[] = {"one", "two", "three", "four"};
    char *lo = (char*)&a[0], *hi = (char*)&a[2];
    SWAP(lo, hi, sizeof(*lo));
    int i;
    for (i = 0; i < 4; i++) {
        printf("a[%d] = %s\n", i, a[i]);
    }
}

输出:

a[0] = three
a[1] = two
a[2] = one
a[3] = four

假设字符串存储器最初是这样的,从地址1000开始:

one\0two\0three\0four\0

数组的值为:

a[0] = 1000 -> one
a[1] = 1004 -> two
a[2] = 1008 -> three
a[3] = 1014 -> four

SWAP ,字符串存储器保持不变,但数组现在为:

a[0] = 1008 -> three
a[1] = 1004 -> two
a[2] = 1000 -> one
a[3] = 1014 -> four

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM