IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言06 const详解+const 和define的区别 -> 正文阅读

[C++知识库]C语言06 const详解+const 和define的区别

1、C语言的关键字const的含义和用途。

?含义:const是只读的意思,被const修饰的东西都受到强制保护,只允许访问不允许被改变,可以预防意外的变动,能提高程序的健壮性

通过给编译器特定的附加信息,可以使编译器保护那些不希望被改变的参数,防止其被无意的代码修改。

用途

(1)可以定义 const 常量

(2)可以修饰指针

(3)可以修饰函数的参数、返回值,甚至函数的定义体。

2、const 用法:限定变量和指针

(1)const int a;

(2)int const a; ?//似ROM

1和2作用一样,a为常整型数。限定a数据成员只能被访问不能被修改。即a不可变。

(3)const int *a;

(4)int const *a;

3和4作用一样,限定a的指向,a只能指向常整型

a可变,可以指向不同的常整数;但是被a指定的内容*a是常整型,不可变的。

a本身可变,但*a不可变

const int b=5, c=6;

a = &b;

a = &c;
const char *name=“chen”;

name[3]=‘a’; //错误

name=“zhang”; //正确

(5)int* const a;

限定a为指向整数的常指针,即指针的指向不能修改

a不可变,但是*a可变;

	 int b = 6;
	 int *const a = &b;
	 b = 7;
	 printf("*a = %d", *a);  //输出 *a = 7
  char *const  name=“chen”;
  name[3]=‘a’; //正确
  name=“zhang”; //错误——改变了首地址

(6)int const * const a;

限定a为指向一个常整数的常指针,即a不可变,*a也不可变

const int b=5;

a = &b;

========

@助记方法:把一个声明从右向左读。

(const int) a;

(int const) a;

(const int) (*a);

(int const) (*a);

(int*) (const a);

(int const *) (const a);

3、const 限定函数参数

void function(const int Var);

传递过来的参数在函数内不可以改变.

4、const 限定函数返回值型.

const int function(); //此时const无意义

5、const的实际运用:

以下代码有什么问题?

(1)

{
    char* s="AAA";
    printf("%s", s);
    s[0]='B'; 
    printf("%s",s);
}

答: "AAA"是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。

cosnt char* s="AAA";

然后又因为是常量,所以对是s[0]的赋值操作是不合法的。

(2)

{
    char s[10]="AAA";
    printf("%s", s);
    s[0]='B'; 
    printf("%s",s);
}

答:s[10] 表示为非常量,可以进行修改,合法。

@区别char *p ="AAA";和 char p[ ] ="AAA";

(3)

{
    char s[3]="AAA";
    printf("%s", s);
}

答:语法上合法,但是有隐患,数组没有通常终止的'\0'字符。因此该数组不是一个真正的C字符串,从而不能用在strcpy和printf等语句中。

多数情况下,应该让编译器计算数组初始化的初始化个数,在初始值“abc”中,计算得到的长度。

 char b[] = "abc";
printf("b[]= %s\n", b);

(4)

{
    typedef char* pStr;
    char string[4] = "abc";
    const char *p1 = string;  
    const pStr p2 = string;
    p1++;
    p2++;
}

答:*p1作为整体不能被修改,但p1可以修改,p1++合法。

printf("p1 = %s", p1);输出: bc

p2作为一个整体,不能被修改,p2++修改非法

const pStr p2;等同于pStr const p2;就像 const int p2;等同于int const p2;这样p2就是指向整型的常指针。所以p2是不能修改的。

===========const 修饰符和 define的区别===============

【1】3类 有关标志

#define LIMIT?? 100? ?//这里 LIMIT?是一个标志,代表100。

const? int? LIMIT=100;? //这里LIMIT?是一个常量名,在内存有空间放了100,因此有地址,可以用指针指向这个空间,但不能修改它。

int i=100;? //这里i是一个变量名,在内存有空间放了100,因此有地址,可以用指针指向这个空间,而且可以改放别的整数。

【2】在定义常量时,为什么推荐使用const,而不是#define?

C中常用:#define 变量名 变量值 定义一个值替代。

它有个致命缺点:在预处理阶段缺缺乏类型检测机制,这样预处理可能引发错误的隐患,const却没这个问题。

【3】区别的例子

int a =1; 
#define T1 a+a 
#define T2 T1-T1 
cout<<"T2 is "<<T2<<endl; //a+a-a+a=a+a

T2 is 2;

int a =1; 
int const T1=a+a; 
int const T2=T1-T1; 
cout<<"T2 is "<<T2<<endl;

T2 is 0;

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 10:37:50  更:2021-08-02 10:39:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 5:44:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码