const关键字

本文详细解读了C语言中指针和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可以检测到此类错误

}

 

转载于:https://my.oschina.net/u/153520/blog/179184

### const 关键字的使用 - **修饰变量**: ```c const int num = 10; ``` 这里 `const` 修饰 `num` 变量,`num` 成为常量,其值在初始化后不能被修改。如果尝试修改 `num` 的值,编译器会报错。 - **修饰函数的参数**: ```c void func(const int param) { // 在函数内部不能修改 param 的值 } ``` 在这个函数中,`const` 修饰了函数的参数 `param`,意味着在 `func` 函数内部不能修改 `param` 的值,起到保护参数的作用 [^3]。 - **与指针变量的搭配**: - **指向常量的指针**: ```c const int *ptr; ``` `ptr` 是一个指向常量的指针,不能通过 `ptr` 来修改它所指向的值,但 `ptr` 本身可以指向其他地址。 - **指针常量**: ```c int * const ptr; ``` `ptr` 是一个指针常量,`ptr` 本身的值(即所指向的地址)不能被修改,但可以通过 `ptr` 修改它所指向的值。 - **指向常量的指针常量**: ```c const int * const ptr; ``` `ptr` 既不能指向其他地址,也不能通过它修改所指向的值。 ### const 关键字的作用 - **提高程序的安全性**:在函数参数中使用 `const` 可以防止函数内部意外修改传入的参数,保护数据的完整性。例如,当函数的参数是指针时,使用 `const` 可以避免函数内部对指针所指向的数据进行修改 [^3]。 - **增强代码的可读性**:使用 `const` 可以明确变量的使用方式,让其他开发者更容易理解代码的意图。例如,当看到一个函数的参数被 `const` 修饰时,就知道该参数在函数内部不会被修改。 - **替代 `#define` 定义常量**:虽然单独定义 `const` 变量没有明显的优势,完全可以使用 `#define` 命令代替,但 `const` 有类型检查,而 `#define` 只是简单的文本替换。例如: ```c const int MAX = 100; #define MAX_VALUE 100 ``` `const` 定义的 `MAX` 有具体的类型 `int`,而 `#define` 定义的 `MAX_VALUE` 只是一个简单的文本替换,没有类型信息。 ### 相关知识 在C语言中,`const` 修饰的变量在编译时通常会被分配内存空间,并且在程序运行期间其值不能被修改。不过,在某些情况下,编译器可能会对 `const` 变量进行优化,将其值直接嵌入到代码中。另外,`const` 修饰的变量在不同的作用域中有不同的生命周期和可见性,遵循C语言的作用域规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值