簡體   English   中英

當我們在C中使用兩個指針時會發生什么?

[英]What does happen when we equation two pointer in C?

這是一個C代碼,用於從每個索引開始對大字符串的子字符串進行排序,但我無法理解如何在代碼中對數組a進行排序。

據我所理解:

  • 我們將a[i]引用到&c[i] ,因此它創建了n個數組但是沒有&a[i][1] == &a[i+1][0]
  • 由於a[i] = &c[i]&a[i][0] == &c[i]是否正確?

  • 如果沒有,這看起來像是一種更快的方式來創建n(原始字符串的長度)數組,而不實際復制它。 真的嗎?

我的代碼

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define M 1
#define MAXN 5000000
char c[MAXN], *a[MAXN];
int pstrcmp(char **p, char **q){ 
    return strcmp(*p, *q); 
}
int main(){ 
    int i, ch, n = 0, maxi, maxlen = -1;
    while ((ch = getchar()) != EOF) {
        a[n] = &c[n];
        c[n++] = ch;
    }
    c[n] = 0;
    qsort(a, n, sizeof(char *), pstrcmp);
    printf("%s",a[1]);
    return 0;
}

我猜pstrcmpstrcmp一個包裝器,它比較了兩個指向char指針的指針。 就像是:

int pstrcmp(const void *a, const void *b) {
  return strcmp(*(char**)a, *(char**)b);
}

要回答你的問題,

  • 是的, &a[i][1] == &a[i+1][0] 它們都指向ci + 1個字符。
  • 是的, &a[i][0] == &c[i]
  • 你確實在創建指向n字符串的指針,但是有一個問題:如果你改變了任何字符串(比如最后一個字符),你就會改變更多的字符串。 所以這些字符串不是獨立的。

從概念上講, a[i]是指向從位置i開始的c的后綴的指針。 然后程序根據它們指向的字符串的值對a進行排序。 所以,對於c = "abacaba" ,你會得到{ "a", "aba", "abacaba", "acaba", "ba", "bacaba", "caba" }

請注意,有更快的方法來構建后綴數組

在這段代碼中,我沒有看到子字符串,因為你沒有構建任何子字符串。
從技術上講, a是一個char類型的指針數組,它可以使它成為一個字符串數組,但是你將c鏈接到a ,實際上ac的索引。
在循環內部,您通過char填充索引char。 稍后當您對a排序時,您會對索引進行排序。

隨着指數的問題是,你不能真正把它打印出來作為一個字符串,因為它不是一個char *%s printf格式修改預期,但一個char ** 僅這一點就應該警告你一些怪異的東西。 我看到你把這個問題作為硬編碼a[1]作為參數來回避這個問題,但是使用什么索引的唯一問題是告訴你,你的方式是錯誤的。

我稍微編輯了你的代碼,它將如何打印排序的數組。 如果你認為它沒有做你想要的,那么你想要什么和你的代碼之間有什么誤解(除了最后的printf )。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define MAXN 5000000
// This is an array of characters:
char c[MAXN];
// This is an array of pointers pointing to individual characters. Essentially, this is an index.
char *a[MAXN];
static int pstrcmp(const void *p1, const void *p2){
    // wrapper between strcmp and qsort's compare signature.
    // See: man 3 qsort -- http://linux.die.net/man/3/qsort
   return strcmp(* (char * const *) p1, * (char * const *) p2);
}
int main() {
    int ch;
    size_t n = 0;
    while ((ch = getchar()) != EOF) {
        // In this loop, you systematically build up an index, where a[i] points to c[i].
        a[n] = &c[n];
        c[n] = ch;
        n++;
    }
    c[n] = 0;
    qsort(a, n, sizeof(char *), pstrcmp); // Now, you sort the _index_.
    printf("\nc: %s\n", c); // Print Original array.
    printf("a: "); // Print Ordered array:
    for (size_t i = 0; i < n; i++)
        printf("%c", *a[i]); // Look at the indirection
    printf("\n");
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM