2016-07-25 30 views

回答

1

C,一個char**意味着pointerpointercharacter


char c; 

c裝置是一個字符。


char *cptr; 

裝置

1. `*cptr` is a character 
2. `cptr` is a pointer to a characer 

char **pptr; 

裝置

1. `**pptr` is a character 
2. `*pptr` is a pointer to a character 
3. `pptr` is a pointer to a pointer to a character 

在你的情況:

char **sachar **sbpointer to pointer to characters

而且,*sa*sbpointer to characters

strcmp有兩個pointer to characters作爲參數,所以你通過這兩個pointer to characters當你調用strcmp爲:

strcmp(*sa, *sb) 

而已,如果你感到困惑如何調用該功能的情況下,你需要做這樣的事來稱呼它。

/* Two strings */ 
char st1[] = {'a', 'b', 'c', '\0'}; 
char st2[] = {'c', 'b', 'a', '\0'}; 

/* Call compare */ 
int ret; 
ret = compare((void *) &st1, (void *) &st2); 
/* Do something based on value of `ret' */ 
0

這是一個指針(指向char的指針)。考慮這個

char c='x'; 
char *ptr=&c; 
char **ptr2ptr=&ptr; 

簡化:

c is char 
ptr is char* 
*ptr is a char 
ptr2ptr is char** 
*ptr2ptr is char* 
**ptr2ptr is char 
1

兩個星號指定一個指針的指針。這就是爲什麼你需要它在一個程序中排序字符串:

回想一下,C代表字符串作爲字符數組。每個C字符串通常表示爲指向字符的指針,即char*,所以C字符串數組是char*的數組。

C標準排序算法實現使用比較函數,該函數採用指向數組元素的指針。由於每個元素都是一個指針,因此該函數需要一個指向指針的指針。

傳遞給指針compare的指針的指針被包裝在void*中,該指針允許在任何數據指針之間進行轉換。比較函數做的第一件事是鑄造void*char**,讓其可以取消引用兩個:

char** sa=(char**)a; // a is a char**, so we do the cast. 

現在在左側的字符串在*sa發現,並在弦右邊是*sb。這是我們通過strcmp

0

這是一個雙指針(指針指針)。 Double (**)用於表示雙指針。

雙指針存儲address of the Pointer Variable

爲前:

int num, *ptr1, **ptr2; 
ptr1 = # 
ptr2 = &ptr1; 
0

最簡單的,幼稚,解釋的char**

char c = 'a'; 
char* p1 = &a; 
char** p2 = &p2; 

p2是一個指向指針的char

在表達式中,

*p計算結果爲char*

**p評估爲char*

但是,在您的文章中的函數的上下文中還有更多。 「比較」功能用於排序對象。標準庫函數qsort需要與您的compare函數具有相同簽名的函數才能正常工作。

在你的情況下,compare返回一個值,qsort可以使用該值對字符串數組進行排序。

鑑於字符串如數組:

char* strings[] = { ... }; // Initialize the strings 

可以通過使用

int numberOfStrings = ...; 
qsort(strings, numberOfStrings, sizeof(*strings), compare); 

qsort呼叫comparestrings的元素通過使用字符串進行排序一個void*因爲qsort是不可知的數據類型由第一個參數保存。唯一可以調用比較函數的便攜方式是通過void*

在比較函數中,用戶必須在進行比較之前適當地投下指針。

當比較函數預期比較兩個字符串時,void*需要轉換爲char**,然後在解除引用的指針上調用strcmp

相關問題