簡體   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