[心得] const指標的整理
以前曾經整理過const, static, vla指標的宣告和定義方法,供大家參考,
看看有沒有遺漏的case。
void Foo( int * ptr,
int const * ptrToConst,
int * const constPtr,
int const * const constPtrToConst );
但是還有很多種變形
const int* ptrToConst;
const int* const constPtrToConst
const (int *) ptrToConst;
(int *) const constPtr;
如果配合上int * = int []的話
int ptr[];
const int ptrToConst[];
int constPtr[const]; // C99 new feature
const int constPtrToConst[const];
基本上,不考慮()的話,就是從*切成兩半,
const在*左邊就是形容指向的內容,const在*的右邊就是形容指標。
又,C99有提供了VLA和static,所以整理一下
void f( int n, int array[] ); // 合法,C90慣用法
void f( int n, int array[10] ); // 合法,但是有沒有那10根本就沒差
void f( int n, int array[n] ); // 合法,告訴編譯器array長度是n
void f( int n, int array[*] ); // 合法,告訴編譯器array是vla (只能用在宣告)
void f( int n, int array[static 10] ); // 合法,告訴編譯器array長度至少有10
void f( int n, int array[static n] ); // 合法,告訴編譯器array長度至少有n
以往在ANSI C的年代,要搞定二維陣列都很麻煩,把陣列傳給一個
函式的時候,除了第一維度可以省略之外,其他維度的大小都需要知道。
f( int n, int m, int matrix[][] ); // 非法
f( int n, int m, int matrix[][MAX] ); // 合法,但是MAX是固定的
如果要函式可以任意接受維度不同的陣列,在ANSI C的解法就是要
手動計算index,非常的麻煩。
但是在C99之中,可以這樣宣告
f( int n, int m, int matrix[][*] );
f( int n, int m, int matrix[*][*] );
定義寫成
f( int n, int m, int matrix[][m] );
f( int n, int m, int matrix[n][m] );
如此一來,就可以讓編譯器自己去計算index了,至於要讓這程式跟
動態配置的陣列混用的話,必需要使用一維陣列模擬二維陣列的方法。
另外static只能使用在最高維度上面
f( int n, int m, int matrix[static n][m] ); // 合法
f( int n, int m, int matrix[m][static m] ); // 非法
f( int n, int m, int matrix[static n][static m] ); // 非法
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.119.162.50
推
04/10 14:39, , 1F
04/10 14:39, 1F
推
04/10 14:43, , 2F
04/10 14:43, 2F
推
04/10 15:00, , 3F
04/10 15:00, 3F
推
04/10 15:57, , 4F
04/10 15:57, 4F
推
04/10 16:21, , 5F
04/10 16:21, 5F
推
04/10 16:46, , 6F
04/10 16:46, 6F
推
04/10 16:49, , 7F
04/10 16:49, 7F
→
04/11 02:15, , 8F
04/11 02:15, 8F
→
04/11 02:15, , 9F
04/11 02:15, 9F
→
04/11 02:16, , 10F
04/11 02:16, 10F
推
05/23 05:16, , 11F
05/23 05:16, 11F