【c】C語言中的三重指標:這是樣式問題嗎? - 程式人生

文章推薦指數: 80 %
投票人數:10人

【c】C語言中的三重指標:這是樣式問題嗎? ... 從基礎開始,單指標有兩個用途:建立陣列和允許函式更改其內容(按引用傳遞): char *a; a = malloc. 程式人生>c>C語言中的三重指標:這是樣式問題嗎? 【c】C語言中的三重指標:這是樣式問題嗎? 阿新••發佈:2020-12-11 我覺得c中的三分球被認為是“壞的”。

對我來說,有時使用它們是有意義的。

從基礎開始,單指標有兩個用途:建立陣列和允許函式更改其內容(按引用傳遞):char*a; a=malloc... 或voidfoo(char*c);//meansI'mgoingtomodifytheparameterinfoo. {*c='f';} chara; foo(&a); 雙指標可以是二維陣列(或陣列陣列,因為每個“列”或“行”的長度不必相同)。

我個人喜歡在需要傳遞1D陣列時使用它:voidfoo(char**c);//meansI'mgoingtomodifytheelementsofanarrayinfoo. {(*c)[0]='f';} char*a; a=malloc... foo(&a); 對我來說,這有助於描述foo在做什麼。

但是,沒有必要:voidfoo(char*c);//amImodifyingacharorjustpassingachararray? {c[0]='f';} char*a; a=malloc... foo(a); 也會起作用的。

根據thisquestion的第一個答案,如果foo要修改陣列的大小,則需要一個雙指標。

我們可以清楚地看到如何需要一個三指標(甚至更高的指標)。

在我的例子中,如果我傳遞一個指標陣列(或陣列陣列),我將使用它。

顯然,如果您要傳遞到一個正在更改多維陣列大小的函式中,則需要它。

當然,陣列陣列不是很常見,但其他情況是。

那麼有哪些慣例呢?這真的只是一個風格/可讀性的問題嗎?加上許多人很難把自己的頭繞在指標上? 解決辦法 使用triple+指標會損害可讀性和可維護性。

假設這裡有一個小函式宣告:voidfun(int***); hmmm.是一個三維交錯陣列的引數,或指向二維交錯陣列的指標,或指向陣列指標的指標(如中所示,函式在函式中分配陣列並將指標分配給int)我們將其與:voidfun(IntMatrix*); 當然,您可以使用int的三點指標來操作矩陣。

但事實並非如此。

它們在這裡作為三重指標實現的事實與使用者無關。

應該封裝複雜的資料結構。

這是面向物件程式設計的重要思想之一。

即使在C語言中,你也可以在一定程度上應用這一原則。

將資料結構包裝在一個結構中(或者,在c中非常常見,使用“handles”,即指向不完整型別的指標——這個習慣用法將在後面的回答中解釋)。

假設您將矩陣實現為double的交錯陣列。

與連續的2d陣列相比,它們在迭代時更糟(因為它們不屬於連續記憶體的單個塊),但允許使用陣列表示法進行訪問,並且每一行可以有不同的大小。

所以現在的問題是你現在不能改變表示,因為指標的使用是硬連線在使用者程式碼上的,現在你被劣質的實現困住了。

如果你把它封裝在一個結構中,這甚至都不是問題。

typedefstructMatrix_ { double**data; }Matrix; doubleget_element(Matrix*m,inti,intj) { returnm->data[i][j]; } 只是改成typedefstructMatrix_ { intwidth; doubledata[];//C99flexiblearraymember }Matrix; doubleget_element(Matrix*m,inti,intj) { returnm->data[i*m->width+j]; } handle技術的工作方式如下:在標頭檔案中,宣告一個不完整的結構和所有作用於結構指標的函式://structdeclarationwithnobody. structMatrix_; //optional:allowpeopletodeclarethematrixwithMatrix*insteadofstructMatrix* typedefstructMatrix_Matrix; Matrix*create_matrix(intw,inth); voiddestroy_matrix(Matrix*m); doubleget_element(Matrix*m,inti,intj); doubleset_element(Matrix*m,doublevalue,inti,intj); 在原始檔中,宣告實際結構並定義所有函式:typedefstructMatrix_ { intwidth; doubledata[];//C99flexiblearraymember }Matrix; doubleget_element(Matrix*m,inti,intj) { returnm->data[i*m->width+j]; } /*definitionoftherestofthefunctions*/ 世界其他地方不知道structMatrix_包含什麼,也不知道它的大小。

這意味著使用者不能直接宣告值,只能使用指向Matrix和create_matrix函式的指標。

然而,使用者不知道大小意味著使用者不依賴它-這意味著我們可以隨意刪除或新增structMatrix_成員。

使用fstat()與stat()有什麼優勢? «上一篇 為什麼C11不支援Lambda函式下一篇» 相關推薦 C語言中的三重指標:這是樣式問題嗎? 練習:在C語言中使用指標交叉函式將返回錯誤“一元'*'(具有'int')的無效型別引數” 我可以對C語言中的void*指標進行算術運算嗎? C語言中的“this”指標(不是C++) 關於C語言中字元指標的困惑 C語言中陣列指標的奇怪行為 錯誤:在C語言中,結構指標出現錯誤“將指標解引用為不完整型別” 在C語言中,宣告指標的正確語法是什麼? 在C語言中,將NULL指標傳遞給strcmp()會發生什麼情況? C語言中陣列,指標和字串之間的區別 搜尋 基礎教學 Mysql入門 Sql入門 Android入門 Docker入門 Go語言入門 Ruby程式入門 Python入門 Python進階 Django入門 Python爬蟲入門 新加入文章



請為這篇文章評分?