[英]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;
}
我猜pstrcmp
是strcmp
一個包裝器,它比較了兩個指向char指針的指針。 就像是:
int pstrcmp(const void *a, const void *b) {
return strcmp(*(char**)a, *(char**)b);
}
要回答你的問題,
&a[i][1] == &a[i+1][0]
。 它們都指向c
第i + 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
,實際上a
是c
的索引。
在循環內部,您通過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.