关于const的具体定义

一、关于const的具体定义:

     const是一个C语言的关键字,它限定一个变量不允许被改变。

  

二、关于const的问题:

  问题:const变量 & 常量  

 为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢?    

  const int n = 5;  

 int a[n];  

 答案与分析:   

  1)、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, “abc”,等,肯定是只读的,因为常量是被编译器 放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的。

 2)、注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理     的,只是 ANSI C对数组的规定限制了它。  

 3)、那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。

const变量 & 字符串常量

   char *p = "i'm hungry!";   p[0]= 'I';  

答案与分析:  

 上面的代码可能会造成内存的非法写操作。分析如下, “i'm hungry”实质上是字符串常量,而常量往往被编译器放 在只读的内存区,不可写。p初始指向这个只读的内存区,而p[0] = 'I'则企图去写这个地方,编译器当然不会答应。

const & 指针

  类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?  

 1)、const在前面  

   const int nValue; //nValue是const  

  const char *pContent; //*pContent是const, pContent可变   

const (char *) pContent;//pContent是const,*pContent可变   

char* const pContent; //pContent是const,*pContent可变  

 const char* const pContent; //pContent和*pContent都是const  

2)、const在后面,与上面的声明对等  

 int const nValue; // nValue是const  

char const * pContent;// *pContent是const, pContent可变  

 (char *) const pContent;//pContent是const,*pContent可变  

 char* const pContent;// pContent是const,*pContent可变   

char const* const pContent;// pContent和*pContent都是const  

、关于const的具体作用

    A。const最经常的用法
           1.为了防止传递的函数参数不被修改,在调用函数的形参中用const关键字.
               //Example ->

               int FindNum(const int array[], int num, int conut);//声明函数

               //code...

               int FindNum(const int array[], int num, int count)
               {
                          int i;
                          int flag = 1;

                          for (i = 0; (i < count) && flag; i++)
                          {
                                   if (array[i] == num)
                                   {
                                           flag = 0;
                                           break;
                                   }
                           }
                           return flag;
                }
                //code...
                
           上面这例子中,编译器会把array[]当作常量数据的数组看待。所以,假如你不小心给数组赋值,那么

,编译器就会报错了。因此,当你不需要也不想修改数组的数据时,最好用const把数组定义为常量数组。

           2.const可以用来创建数组常量、指针常量、指向常量的指针等:
             const char ch = 'a';
             const int a[5] = {1, 2, 3, 4, 5};  
             const int *p = a;              //a是一个数组的首地址.p是指向常量的指针
             int * const p = a;             //a是一个数组的首地址.p是指针常量;
             const int * const p = a;    //a是一个数组的首地址。p是指向常量的指针常量

             前两种情况很简单,现在着重分析一下后三种用法,因为这3种情况容易出错,偶就有时候怕用错了

刚脆不用const.

  ——const int *p = a;       

p是指向常量的指针,因此,不可以通过给指针赋值来改变数组中的数据,

例如:
            *p = 10;       /*错误*/
            *(p + 2) = 1;  /*错误*/
  假如指向常量指针可以改变值,那么,就等于也改变了数组的数  据了。假如你不理解,偶倒有一个办法让你理解,你就想你和一  个人绑在一起,有可能你移动了位置而他不跟着你移动吗!哈哈

             ——int * const p = a;      

看这表达式,const的位置和第一个不同吧!他们的用法和作用就完全不一样了。这时候p是指针常量,我们知道,指针是指向了一个数组的首地址,那么,它的位置就不可以改变了。但是你现在应该和第一个表达式比较了,现在的数组并不是常量数组,所以数组的数据是可以改变的,而指针这时候它是不可以移动的,指向数组第一个数据,所以它可以而且只可以改变数组第一个数据的值。这一点请别误解,指针常量只是它的地址不可以改变,并不是它指向的内容一定不可以改变,好啦。假如你又不理解,偶又有一个比较形象的例子来说明:
假如有一个固定的人拉着另外一个人的手,注意,固定的人相当于他是不可以由其他人来替换的。但是他可以拉其他人的手啊,并不一定规定他必须拉同一个人的手啊。现在你应该可以有个比较深的印象和理解吧:
下面举几个例子帮助理解:
         //  *p = 2;          /*可以*/
        //  *(p+1) = 10;     /*可以*/
        //  p++;             /*不可以*/

            ——const int * const p = a; //假如前面两种表达式的本质你理解了,这种表达式你来理解根本没有问题,const现在有两个,而且一个const的位置是第一种情  况的位置,第二个const是第二种情况的位置,所以这表达式的功能就是前两种情况的作用总合。这里不多说!

           //下面举几个例子帮助理解:
          //  *p = 2;             /*不可以*/ 
          //  *(p + 2) = 10;   /*不可以*/
          //  p++;                /*不可以*/

### 如何在编程中使用 `Const` 定义两个数值 在编程语言中,`const` 通常用于定义编译时常量。以下将基于不同编程语言的语法特点,展示如何使用 `const` 定义两个数值。 #### C# 中使用 `const` 定义两个数值 在 C# 中,`const` 关键字用于声明一个在编译时必须被初始化且不可更改的常量[^2]。以下是示例代码: ```csharp public class ConstantsExample { const int Value1 = 10; const double Value2 = 3.14; public void DisplayConstants() { System.Console.WriteLine("Value1: " + Value1); System.Console.WriteLine("Value2: " + Value2); } } ``` 上述代码中,`Value1` 和 `Value2` 被定义为常量,并分别赋值为整数和浮点数。 #### JavaScript 中使用 `const` 定义两个数值 在 JavaScript 中,`const` 用于声明块级作用域的只读变量。一旦声明并赋值后,其值不能被重新分配。以下是示例代码: ```javascript const Value1 = 10; const Value2 = 3.14; console.log("Value1:", Value1); console.log("Value2:", Value2); ``` 此代码片段展示了如何在 JavaScript 中定义两个常量 `Value1` 和 `Value2`。 #### C++ 中使用 `const` 定义两个数值 在 C++ 中,`const` 用于定义不可变的变量。它可以在编译时或运行时初始化,具体取决于上下文。以下是示例代码: ```cpp #include <iostream> int main() { const int Value1 = 10; const double Value2 = 3.14; std::cout << "Value1: " << Value1 << std::endl; std::cout << "Value2: " << Value2 << std::endl; return 0; } ``` 这段代码展示了如何在 C++ 中定义两个常量 `Value1` 和 `Value2`,并输出它们的值。 #### C语言中使用 `const` 定义两个数值 在 C 语言中,`const` 用于定义不可修改的变量。如果希望将常量存储在 ROM 中以节省 RAM 资源,则可以结合 `code` 关键字使用(适用于某些嵌入式系统)[^3]。以下是示例代码: ```c #include <stdio.h> const int Value1 = 10; // 存储在数据段 const double Value2 = 3.14; // 存储在数据段 int main() { printf("Value1: %d\n", Value1); printf("Value2: %f\n", Value2); return 0; } ``` 对于 51 单片机等嵌入式系统,若需要将常量存储在 ROM 中,可使用如下方式: ```c code int Value1 = 10; // 存储在程序存储器 code double Value2 = 3.14; // 存储在程序存储器 ``` 上述代码中,`code` 关键字确保常量存储在程序存储器中,从而节省 RAM 资源[^3]。 --- ### 注意事项 - 在 C# 中,`const` 必须在声明时初始化,并且其值必须是编译时常量[^2]。 - 在 JavaScript 中,`const` 声明的变量虽然不可重新赋值,但如果是对象或数组类型,则其内容可以被修改[^2]。 - 在 C 和 C++ 中,`const` 的作用范围和存储位置取决于具体的实现细节和编译器选项。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值