C语言const关键字用法

2023-09-06 0 513

constURL是constant的简写,译者为自变量、物理量。能用作润色表达式、字符串、操作形式符、auth等。其润色的第一类根本无法展开黎贞操作形式,无法展开载入等操作形式。则表示无法透过第一类这类去修正相关联缓存中的值,但可以透过其它形式修正,比如说操作形式符。

须要特别注意的是C词汇中的const和C++中的const不那样。

1.const润色表达式:

他们在表述表达式是假如不期望该表达式值在程序代码操作过程中被不留神数人修正,能采用const来润色该表达式。

须要特别注意的是const润色局部表达式和全局表达式时有差别。

const润色局部表达式:事实上是能修正的,其本质上是栈帧上缓存地区是复本可写的。

#include <stdio.h> int main(){ const int a=2; //a = 2; //无法间接修正 int *p = &a; //能透过操作形式符去修正 *p = 5; printf(“%d\n, a); //列印结论a=5. return 0; }

const润色全局表达式:无法被修正,其本质上是const修正的全局表达式位于黎贞的缓存地区。

#include <stdio.h> const int a=2; int main(){ int *p = &a; *p = 5; printf(“%d\n, a); //出错 return 0; }

2.const润色字符串:

const int array[5] = { 0,1,2,3,4 }; array[0] = 100; //报错,无法被修正

const润色字符串时,其值无法被间接修正,但能借助操作形式符修正内部的值。如下所示:

#include<stdio.h>int main(){ const int array[5] = { 0,1,2,3,4 }; //array[0] = 100; 直接修正报错 int *p = array; //利用操作形式符修正 *p = 100; printf(“%d\n, array[0]); }

3.const润色操作形式符:

const 离表达式名近就是用来润色操作形式符表达式的,离表达式名远就是用来润色操作形式符指向的数据,假如都有const润色,那么就同时润色操作形式符表达式以及它指向的数据。

3.1自变量操作形式符

能理解为const润色 * ,则表示const润色的操作形式符指向的内容无法改变,但操作形式符这类的指向能改变。

//下面两种情况,自变量操作形式符,const润色*,则表示无法透过 *p1 这种写法改变指向缓存地址的表达式值 const int *p1; int const *p2;

例子:

#include <stdio.h> int main(){ int a = 2; int b = 80; const int *p=&a; // *p = 5; //报错,操作形式符指向的内容无法改变。 a = 5; p = &b; //能修正 p 操作形式符指向的缓存地址 printf(“a=%d\n, a); //列印为 a=5 printf(“*p=%d\n,*p); //列印为 *p=80 return 0;

3.2操作形式符自变量

能理解为const润色指针(p3) ,则表示const润色的操作形式符的指向无法改变,但操作形式符指向的内容能改变。

//第三种润色,操作形式符自变量,const润色的是操作形式符表达式p3,则表示p3指向的地址无法改变,但指向地址中保存的数值是能改变的 int * const p3;

例子

#include <stdio.h> int main(){ int a = 2; int b = 80; int * const p=&a; *p = 5; // 能修正 p 指针指向缓存的表达式值 a = 8; // p = &b; 报错,无法修正 p 操作形式符指向的地址。 printf(“a=%d\n, a); //列印 a=8 printf(“*p=%d\n,*p); //列印 *p=8 return 0; }
//以下写法,其操作形式符指向的缓存地址和指向缓存地址的表达式值都无法修正 const int * const p4; int const * const p5;

const润色auth:

其本质上函数的参数也是表达式或者操作形式符,和上述那样,均无法间接修正参数值,但能利用操作形式符修正。事实上,const多用作限制函数的形参,一般这样写,外部人员能确定在该函数作用域内传入的实参值不会轻易改变。

const 和非 const 类型转换:

例子:const char *和char *是不同的类型,无法将const char *类型的数据赋值给char *类型的表达式。但反过来是能的,编译器允许将char *类型的数据赋值给const char *类型的表达式。

char *str1 = “hello word”; const char *str2 = str1; // 能的 /* 下面这种最好不要采用,能透过,但会警告。 const char *str1 = “hello word”;char *str2 = str1; */

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务