// 时间 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能够检测到此类错误
}