// 時間 2012.7.31 數組
// 目的 1.說明 const char **p0 與 char **p1 類型不符 spa
// 2.說明 DAN SAKS闡述的問題 指針
// r-read,rw-read、write 對象
f(const char **p) ci
{} it
// main(int argc,char *argv[]) io
main(int argc,char **argv) test
{ 變量
typedef int * PINT; gcc
char c0;
const char c1=1; // c1—r
char const c2=2; // c2—r
//此種寫法在聲明指針變量時,有利於快速理解const修飾的對象
char *a0; // a0—rw,*a0—rw
const char *a1; // a1—rw,*a1—r
char const *a2; // a2—rw,*a2—r
// 兩種等價,第二種寫法在聲明指針變量時,有利於快速理const修飾的對象,也有利於避免使人疑惑的語法規則
char * const a3; // a3—r,*a1—rw
char const * const a4; // a3—r,*a1—r
const char **p1; // p1—rw *p1—rw **p1—r
char const **p2; // p2—rw *p2—rw **p2—r
// 兩種等價,第二種寫法在聲明指針變量時,有利於快速理const修飾的對象
char * const *p3; // p3—rw *p3—r **p3—rw
char ** const p4; // p4—r *p4—rw **p4—rw
const PINT array0[10]; // 指針數組 (array0[i])—r,*(array0[i])—rw
//等同於 PINT const array0[10]; 亦即 int * const array0[10];
const int *array1[10]; // 指針數組 (array1[i])—rw,*(array0[i])—r
//等同於 int const *array1[10];
// 1.都是指向有限定符的相容類型的指針 2.無限定符的相容 // 類型的指針,左邊指針所指向的類型必須具備右邊
// 指針所指向類型的所有限定符——摘自C標準手冊。故類賦 // 值合法
a0=&c0; // 左右同樣
a1=&c0; // 左比右多
a1=&c1; // 左右同樣
a1=&c2; // 左右同樣
a1 = a0; // 左右同樣
// a0 = a1; // 右比左多
p1 = &a0; // 左比右多 p1指向 count char* &a0爲char* 類型不符
*p1 = a1; // 左右同樣
*p1 = &c0; // 左比右多
*p1 = &c1; // 左右同樣
// *p1 = &a0; // E:\C\TEST\sizeof_test.c(47) : warning C4047: '=' : 'const char *' differs in levels of indirection from 'char ** '
// **p1 = c0; // E:\C\TEST\sizeof_test.c(48) : error C2166: l-value specifies const object
p3 = &a0;
**p3 = c0; // 左右同樣
**p3 = c1; // 左右同樣
*p4 = a0; // 左右同樣
*p4 = &c0; // 左右同樣
**p4 = c0; // 左右同樣
// f(argv); //此處調用,類型不符。argv 存儲char型指針的地址,p 只能存儲const char型指針的地址
// VC6.0檢測不到,gcc能夠檢測到此類錯誤
}