char **在c程序中意味着什麼,有人可以給出正確的解釋。 我正在看一個函數指針相關的排序指針,它有點混亂。char **在c程序中意味着什麼,有人可以給出正確的解釋
int compare(const void* a,const void* b)
{
char** sa=(char**)a;
char** sb=(char**)b;
return strcmp(*sa,*sb);
}
char **在c程序中意味着什麼,有人可以給出正確的解釋。 我正在看一個函數指針相關的排序指針,它有點混亂。char **在c程序中意味着什麼,有人可以給出正確的解釋
int compare(const void* a,const void* b)
{
char** sa=(char**)a;
char** sb=(char**)b;
return strcmp(*sa,*sb);
}
在C
,一個char**
意味着pointer
到pointer
到character
。
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 **sa
和char **sb
是pointer to pointer to characters
。
而且,*sa
和*sb
是pointer 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' */
這是一個指針(指向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
兩個星號指定一個指針的指針。這就是爲什麼你需要它在一個程序中排序字符串:
回想一下,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
。
這是一個雙指針(指針指針)。 Double (**)
用於表示雙指針。
雙指針存儲address of the Pointer Variable
。
爲前:
int num, *ptr1, **ptr2;
ptr1 = #
ptr2 = &ptr1;
最簡單的,幼稚,解釋的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
呼叫compare
與strings
的元素通過使用字符串進行排序一個void*
因爲qsort
是不可知的數據類型由第一個參數保存。唯一可以調用比較函數的便攜方式是通過void*
。
在比較函數中,用戶必須在進行比較之前適當地投下指針。
當比較函數預期比較兩個字符串時,void*
需要轉換爲char**
,然後在解除引用的指針上調用strcmp
。
指向指針的指針。 – AntonH