const关键字与数组、指针

目录

  • const关键字
  • const修饰数组
  • const修饰指针
  • 用两个const修饰指针

@
开始回顾C基础知识。C中使用指针是很危险的事情,一个不慎就会造成程序崩溃,因此对于传入函数的参数进行保护就是必须的了,特别是针对数组。

const关键字

const关键字用于将一个变量声明为只读,也就是常量,无法被修改。

const int constant = 10;//声明constant为常量的同时对它进行初始化赋值
int const constant = 10;//也可以将const放在int后面

const修饰数组

使用const来修饰数组声明了一个数组常量,是对数组里面数据的一种保护,当试图修改一个被const修饰的数组内容时,编译时会产生错误。

const int days[5] = {1,2,3,4,5};//int const days[5]一样
//想要把days[0]重新赋值为6,报错
days[0] = 6;
//Cannot assign to variable 'days' with const-qualified type 'const int [5]'

但是我们有一点要注意,是不是days里面的数据一定无法修改呢?我们做个试验:

    const int days[5] = {1,2,3,4,5};
    int * p = days;
    *p = 6;
    for (int i = 0; i < 5; ++i) {
        printf("%d\n",*p++);
    }

结果:

6
2
3
4
5

所以虽然数组days被声明为只读的,但是如果通过指针去访问数组,还是可以改变数组元素的,这也就是指针的强大与易错。

const修饰指针

const修饰指针创建了一个指针常量,但是const的位置会导致这个指针常量有不同的含义。

    int days[5] = {1,2,3,4,5};
    const int *p1;//const修饰的是int,表示p1指向的变量值不可改变,指针本身可以改变
    //p1指向的值为常量
    p1 = days;
    *p1 = 6;//报错,不允许修改指针指向的值。Read-only variable is not assignable
    p1[1] = 7;//报错,不允许修改
    days[0] = 6;//允许,days不是常量
    p1++;//合法,p1这个指针本身是可以修改的,这里让其指向days的第二个元素

    int * const p2 = days;//const修饰的是p2,表示p2这个指针本身是无法修改的,但是其指向的值是可以修改的
    //这里p2本身是常量,因此声明p2的时候就要初始化,否则后面无法对p2进行初始化
    *p2 = 10;//合法,p2指向的值可以修改
    p2 = &days[1];//不合法,报错,p2是常量,因此想要修改指针的值使其指向days[1]不合法。
    //Cannot assign to variable 'p2' with const-qualified type 'int *const'

上面就说明了两种const修饰的指针常量的区别。这里有以下几点需要注意:

  • 将常量或非常量数据的地址赋值给指向常量的的指针是合法的。但是非常量数据的地址可以赋值给普通指针,而常量数据的地址就不可以赋值给普通指针。这样做只会提示不合法,却仍然可以这样操作,但最好不要这样做,数据既然数据已经被声明为常量,那么就不要试图去修改,因此指针不要这样赋值,以免修改了倡廉打个值,就像上面const修饰数组里面说的。
    double un_locked[3] = {1.2,2.3,3.1};
    const double locked[3] = {1.0,2.0,3.0};
    const double * p3 = locked;//合法
    p3 = un_locked;//合法
    p3 = &un_locked[1];//合法
    double *p4;
    p4 = un_locked;//合法
    p4 = locked;//非法,但是程序可以运行,
  • const用来修饰形式参量。C语言的传参特性这里不提,如果函数并不想修改本来的数据,一般会把相应的形式参量修饰为const的,告诉编译器这里要把传进来的指针地址当做常量来对待,不允许修改,当函数体内部想要做修改时,编译器会报错。需要注意的是并不要求传进来的参数是常量,而是编译器这样做保证函数执行过程中对源数据不会修改而已。
void foo(const int *bar);
//foo接受一个指针,并把这个指针当做常量对待
void foo1(int *bar);
//foo1声明接受一个普通指针
int main() {
    int test1[2] = {1,2};
    const int test2[2] = {3,4};

    foo(test1);//合法
    foo(test2);//合法
    foo1(test1);//合法
    foo1(test2);//不合法,不提倡这样做。Passing 'const int [2]' to parameter of type 'int *' discards qualifiers
}

void foo(const int *bar){
}
void foo1(int *bar){
}

用两个const修饰指针

用两个const修饰符修饰指针会使得这个指针本身既不可以更改所指向的地址,也无法修改所指向的数据。

    int days[3] = {1,2,3};
    const int * const p = days;

    p = &days[2];//不合法
    *p = 6;//不合法

const修饰函数本身我还没用过,碰到了再来补上。

原文地址:https://www.cnblogs.com/bobliao/p/9916850.html

时间: 2024-09-29 01:05:29

const关键字与数组、指针的相关文章

const关键字到底该怎么用

前言 我们都知道使用const关键字限定一个变量为只读,但它是真正意义上的只读吗?实际中又该如何使用const关键字?在解答这些问题之前,我们需要先理解const关键字的基本使用.本文说明C中的const关键字,不包括C++. 基本介绍 const是constant的简写,是不变的意思.但并不是说它修饰常量,而是说它限定一个变量为只读. 修饰普通变量 例如: const int NUM = 10; //与int const NUM等价NUM = 9;  //编译错误,不可再次修改 由于使用了co

const关键字和指针的纠缠

const关键字定义的变量 #include<stdio.h>int  main( void ) {    const int a = 10;     a = 20; }12345671234567 结果怎样? 编译错误 [Error] assignment of read-only variable 'a' 变量a是只读的. 得到一个结论,使用const修饰的变量是常量,我们无法修改.在gcc中把const常量放到了data段,和全局变量一样,只是把它放到了一个区域中让我们无法修改,在运行过

int main (int argc, const char * argv[0]) 中参数的含义;指针数组和数组指针

恩,有的编译器初始化时候会产生这样的参数 argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名 1. 几种C++ 常见的参数种类 int main(void); int main(); int main(int argc, char **argv);   //等价于int main(int argc, char *argv[]),是否等价呢?是不是前一个可以表示任意长度的任意个数组,后一个只是定长的任意个数的数组?见下面 int main(int argc, c

c++中const关键字全面总结

一.const作用 1.const定义常量 注意:const只对它左边的东西起作用,唯一的例外就是const本身就是最左边的修饰符,那么它才会对右边的东西起作用. (1)const修饰变量,以下两种定义形式在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的. TYPE const ValueName = value; const TYPE ValueName = value; (2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初

(转) C/C++中const关键字详解

文章转自  http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html 为什么使用const?采用符号常量写出的代码更容易维护:指针常常是边读边移动,而不是边写边移动:许多函数参数是只读不写的.const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替),分类如下: 常变量:  const 类型说明符 变量名 常引用:  const 类型说明符 &引用名 常对象:  类名 const 对象名 常成员函

c++ const关键字

通常,不用const来区别数据的类型,在声明过程中,const关键字起到的是修饰限定的作用. 1 符号常量(通常,在赋初值后,其值不能改变:而常量在定义时必须赋初值) int i; const int k = 3; //标识符k代表的内存单元中存放的int型的数据,关键字const限定,不能通过该标识符k来修改所代表的内存单元中的int值 i和k代表的内存单元存放的都是int型数据,只是const限定的k为常量:符号常量,在声明时必须赋初值,赋初值后其值不能改变 下面尝试通过声明一个指针变量t引

【转载】C/C++中const关键字详解

转自http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html 为什么使用const?采用符号常量写出的代码更容易维护:指针常常是边读边移动,而不是边写边移动:许多函数参数是只读不写的.const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替),分类如下: 常变量:  const 类型说明符 变量名 常引用:  const 类型说明符 &引用名 常对象:  类名 const 对象名 常成员函数:  

【C/C++学院】0729-语音识别/Const关键字/字符串应用/内存分配以及处理海量数据

 语音识别 er.xml <?xml version="1.0" encoding="utf-8"?> <GRAMMAR LANGID="804"> <DEFINE> <ID NAME="CMD" VAL="10"/> </DEFINE> <RULE NAME="COMMAND" ID="CMD"

C与C++的const关键字

之所以要谈const,大概就是被const出现的各种位置搞得头晕目眩了罢. (一)C语言中的const关键字 C语言中const修饰的变量或对象的值不能更改. 比如定义const int i = 0;(或int const i = 0;)那么之后任何对i进行改变的操作都会报错. 当然可以投机取巧地去修改const类型的值,比如取得i的指针然后对指针进行操作 const int i = 0; int * p = &i; *p = 3; const也可以修饰指针类型,这就产生了比较麻烦的情况,那就是