const关键字

// 时间 2012.7.31

// 目的 1.说明 const char **p0 与 char **p1  类型不符

//      2.说明 DAN SAKS阐述的问题

//  r-read,rw-read、write

 

f(const char **p)

{}

 

// main(int argc,char *argv[])

main(int argc,char **argv)

{

typedef int * PINT;

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可以检测到此类错误

}

 

你可能感兴趣的:(C语言关键字const)