【c】C語言中的三重指標:這是樣式問題嗎? - 程式人生
文章推薦指數: 80 %
【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爬蟲入門
新加入文章
延伸文章資訊
- 1[C語言] 指標教學[七]: 多重指標. 一般指標| by MuLong PuYang
那既然有雙重指標,是否也有三重指標,答案是肯定的。我們... | 健康急診室.
- 2指標的指標
記憶體位址就單純是個值,若只是單純想儲存記憶體位址,使用void* 型態的指標就可以了。 如果需要對指標作運算,那指標需要型態,在〈指標與陣列〉最後就看到了, ...
- 3真的很可怕的C語言ch12--指標與陣列讀書筆記 - PL-learning Blog
在本章,終於要說明C語言的最難關--pointer(指標)了。如果能理解指標的話, ... 為了加深理解,試試把範例程式改造成三重指標間接參照吧。
- 4C++ 指標的基本宣告以及指標的指標(雙重指標、三重指標...)
c++ 专栏收录该内容. 6 篇文章 0 订阅. 订阅专栏. 這篇文章主要用來記錄學習指標基本的宣告規則以及雙重指標、三重指標…等多重指標之間的存取關係.
- 5C/C++ 指標和雙重指標以及三重指標 - Follow Fang!
C/C++ 指標和雙重指標以及三重指標. 指標在C語言內是一個很重要的元素,指標可以指到任何的位置,不過要小心使用,能指到記憶體位置,就代表可以透過 ...