设为首页 加入收藏

TOP

const关键字到底该怎么用(一)
2019-01-29 22:08:15 】 浏览:340
Tags:const 关键字 到底 怎么

前言

我们都知道使用const关键字限定一个变量为只读,但它是真正意义上的只读吗?实际中又该如何使用const关键字?在解答这些问题之前,我们需要先理解const关键字的基本使用。本文说明C中的const关键字,不包括C++

基本介绍

const是constant的简写,是不变的意思。但并不是说它修饰常量,而是说它限定一个变量为只读。

修饰普通变量

例如:

const int NUM = 10; //与int const NUM等价
NUM = 9;  //编译错误,不可再次修改

由于使用了const修饰NUM,使得NUM为只读,因此尝试对NUM再次赋值的操作是非法的,编译器将会报错。正因如此,如果需要使用const修饰一个变量,那么它只能在开始声明时就赋值,否则后面就没有机会了(后面会讲到一个特殊情况)。

修饰数组

例如使用const关键字修饰数组,使其元素不允许被改变:

const int arr[] = {0,0,2,3,4}; //与int const arr[]等价
arr[2] = 1; //编译错误

试图修改arr的内容的操作是非法的,编译器将会报错:

error: assignment of read-only location ‘arr[2]’

修饰指针

修饰指针的情况比较多,主要有以下几种情况:
1.const 修饰 *p,指向的对象只读,指针的指向可变:

int a = 9;
int b = 10;
const int *p = &a;//p是一个指向int类型的const值,与int const *p等价
*p = 11;    //编译错误,指向的对象是只读的,不可通过p进行改变
p = &b;     //合法,改变了p的指向

这里为了便于理解,可认为const修饰的是*p,通常使用*对指针进行解引用来访问对象,因而,该对象是只读的。

2.const修饰p,指向的对象可变,指针的指向不可变:

int a = 9;
int b = 10;
int * const p = &a;//p是一个const指针
*p = 11;    //合法,
p = &b;     //编译错误,p是一个const指针,只读,不可变

3.指针不可改变指向,指向的内容也不可变

int a = 9;
int b = 10;
const int * const p = &a;//p既是一个const指针,同时也指向了int类型的const值
*p = 11;    //编译错误,指向的对象是只读的,不可通过p进行改变
p = &b;     //编译错误,p是一个const指针,只读,不可变

看完上面几种情况之后是否会觉得混乱,并且难以记忆呢?我们使用一句话总结:
const放在*的左侧任意位置,限定了该指针指向的对象是只读的;const放在*的右侧,限定了指针本身是只读的,即不可变的。

如果还不是很好理解,我们可以这样来看,去掉类型说明符,查看const修饰的内容,上面三种情况去掉类型说明符int之后,如下:

const *p; //修饰*p,指针指向的对象不可变
const p; //修饰p,指针不可变
const * const p; //第一个修饰了*p,第二个修饰了p,两者都不可变

const右边修饰谁,就说明谁是不可变的。上面的说法仅仅是帮助理解和记忆。借助上面这种理解,就会发现以下几种等价情况:

const int NUM = 10; //与int const NUM等价
int a = 9;
const int *p  = &a;//与int const *p等价
const int arr[] = {0,0,2,3,4}; //与int const arr[]等价

const关键字到底有什么用

前面介绍了这么多内容,是不是都常用呢?const关键字到底有什么用?

修饰函数形参

实际上,为我们可以经常发现const关键字的身影,例如很多库函数的声明:

char *strncpy(char *dest,const char *src,size_t n);//字符串拷贝函数
int  *strncmp(const char *s1,const char *s2,size_t n);//字符串比较函数

通过看strncpy函数的原型可以知道,源字符串src是只读的,不可变的,而dest并没有该限制。我们通过一个小例子继续观察:

//test.c
#include<stdio.h>
void myPrint(const char *str);
void myPrint(const char *str)
{
    str[0] = 'H';
    printf("my print:%s\n",str);
}
int main(void)
{
    char str[] = "hello world";
    myPrint(str);
    return 0;
}
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇c语言基础——基本数据类型 下一篇《The C Programming Language》..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目