首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Pascal const数组实际上不是常量?

在编程语言中,常量是指在程序运行过程中不会改变的值。Pascal是一种编程语言,它的设计目标是提供一种简单、易于学习、安全和高效的编程语言。在Pascal中,使用const关键字声明的数组被认为是常量数组,这意味着数组的元素不能被修改。然而,实际上,Pascal中的const数组并不是真正的常量,因为它们的地址是可以改变的。

这是因为在Pascal中,const数组实际上是存储在内存中的变量,它们的地址是可以改变的。即使数组的元素不能被修改,但是数组的地址可以被改变,因此它们不能被认为是真正的常量。

例如,以下代码演示了如何在Pascal中声明一个const数组:

代码语言:txt
复制
const
  myArray: array[1..10] of Integer = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

虽然myArray的元素不能被修改,但是它的地址可以被改变。因此,它不能被认为是真正的常量。

如果需要在Pascal中声明一个真正的常量数组,可以使用以下代码:

代码语言:txt
复制
type
  TMyArray = array[1..10] of Integer;
const
  myArray: TMyArray = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

在这种情况下,myArray的元素和地址都是不可变的,因此它可以被认为是一个真正的常量数组。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

说出来你们可能不信,但是数组名确实不是指针常量

数组声明(array declaration)所声明的变量) 首先,数组不是常量指针,从两方面: 类型方面,数组的类型是type[size],和常量指针类型type* const不同 使用方面,...sizeof(数组名)等于数组所有元素的大小,而不是sizeof(指针);对数组取地址,得到的指针进行加减,增减字节数是sizeof(数组);你可以用字符串字面量初始化一个字符数组,但是不能用常量指针来初始化一个字符数组...其次,为什么很多老师都说数组常量指针 他们不了解C语言的类型系统和隐式转换规则 他们怕下面的人听不懂 他们解释不清为什么数组名不能进行赋值或者++之类的运算而指针可以 切入正题,我们从类型系统和隐式转换规则来讲...(参见Member access operators) 更进一步,二维数组type[size1][size2],实际上就是元素类型是数组数组,进行隐式转换后得到的首元素指针类型是type(*)[size2...这一套过程,用那个什么数组名是常量指针的说法,是解释不来的。

1.6K60
  • 数组是如何随机访问元素?数组下标为什么从0开始,而不是1?

    数组如何实现随机访问元素 什么是数组数组(Array)是一种线性表数据结构,它用一组连续的内存空间,来存储相同类型的数据。 什么是线性表(Linear List)?...例如:数组,链表,队列,栈 等都是线性表结构。 什么是非线性表? 例如:二叉树,堆,图,等,是非线性表,是因为,在非线性表中,数据之间并不是简单的前后关系。 数组是如何随机访问数组元素?...同数组插入的原理类似 数组如何提高效率?...4,业务开发,使用容器足够,追求性能,首先用数组为什么数组要从 0 开始编号,而不是1? 从偏移角度理解a[0] 0为偏移量,如果从1计数,会多出K-1。增加cpu负担。...为什么循环要写成 for(inti=0;i<3;i++)而不是 for(inti=0;i<=2;i++)。

    6.3K10

    前端面试 【JavaScript】— 函数的arguments为什么不是数组?如何转化成数组

    因为arguments本身并不能调用数组方法,它是一个另外一种对象类型,只不过属性从0开始排,依次为0,1,2...最后还有 callee 和length属性,我们也把这样的对象称为类数组。...那这导致很多数组的方法就不能用了,必要时需要我们将它们转换成数组,有哪些方法呢?...Array.prototype.slice.call() function sum(a, b) { // 将类数组转换为数组 let args = Array.prototype.slice.call...}) console.log(num); }; sum(1,2,3,4,5,6); // 21 Array.from() function sum(a, b) { // 将类数组转换为数组...ES6展开运算符 function sum(a, b) { // 将类数组转换为数组 let args= [...arguments]; // 对转换为数组的方法调用累加

    1.7K40

    B - 识别浮点常量问题

    在分析表达式的时候,变量的类型在变量声明的时候就决定了;而常量的类型需要从常量的形式来判断。 假设你是自动编译器(ACM)开发小组的一员,负责Pascal语言编译器的开发。...你的任务是分析程序分解模块送来的文件,判断其中包含的字符串是否合乎语法的Pascal浮点常量。...Pascal语言对浮点常量的语法要求是:一个浮点常量除了十进制数码之外,必须带有一个小数点或一个指数(紧接在字母e或E之后,在正式文档中也被称为比例因子)。...空格也许会出现在浮点常量的前后,但不会出现在浮点常量中间。 请注意Pascal语言的语法规则没有对浮点数常量的取值范围作出任何假定。 Input 输入只有一行,就是有待识别的字符串。...如果输入文件中的字符串是Pascal浮点常量,请输出字符串“YES”,否则输出字符串“NO”。

    48120

    为什么 C# 的 string.Empty 是一个静态只读字段,而不是一个常量呢?

    进一步可以发现 string.Empty 实际上是一个静态只读字段,而不是一个常量为什么这个看起来最适合是常量的 string.Empty,竟然使用静态只读字段呢?...也就是说,string.Empty 字段并不是一个普通的字段,对它的调用会被特殊处理。但是是如何特殊处理呢?...虽然一般情况下取字符串常量实例的时候会去字符串池,但是不用担心取 "" 会造成性能问题,因为实际上 JIT 编译器已经特殊处理了,不会去找池子。...string.Empty 需要是一个静态只读字段而不是常量?...当然,事实上编译器也可以针对此场景做特殊处理,但为什么不是在编译这一层进行特殊处理,我已经找不到出处了。 本文引申的其他问题 能否反射修改 string.Empty 的值? 不行!

    1.1K00

    Delphi类型和引用

    注意,这 个子句只适用于非数组的属性。 Stored子句指定的布尔表达式可以是一个布尔常量,或布尔类型的字段,也可以是返回布尔值的函 数。...Default子句只适用于数据类型为有序类型或集合类型的属性,并且Default后必须跟一个常量,常 量的类型必须与属性的类型一致。 十四:数组属性 所谓数组属性,就是说属性是个数组。...对于数组属性来说,可以使用Read和Write子句,但Read和Write子句只能指定方法而不是字段,并 且object Pascal规定,Read 子句指定的方法必须是一个函数,函数的参数必须在数量和类型上与索引...Write子句指定的方法必须是一个过程,其参 数是索引变量再加上一个常量或数值参数,该参数的类型与数组属性的元素类型一致。...^_* 十八:索引子句 从声明数组属性的语法可以看出,数组属性可以带索引子句,索引子句由指示字Index加一个整数常量 构成,整数常量的值只能在-32767和32767之间,程序示例如下:

    2.5K30

    手把手教你深入理解cc++中的指针

    三,常量指针与指针常量 请看下面两行代码: int a = 10; const int * p1 = &a; //常量指针 int * const p2 = &a; //指针常量 上面第二行代码中的...意味着它指向的值可以修改,但是指针的指向不可修改,与常量指针刚刚相反: int a = 10; int b = 20; int * const p1 = &a; //指针常量 *p1 = 100;...//正确 p1 = &b; //错误,指针的指向不可以修改 因此,我们总结下: 名称 意义 特点 const int * p 常量指针 指向可修改,指向的值不可修改 int * const p...arr本身就是一个指针,但是这个指针不是指向整个数组,而是指向数组的首元素的地址。...(arr) / sizeof(int); } 上面这行代码语法上没有问题,但是得出的结果却不是我们想要的结果,为什么呢,这是因为数组名作为函数传递的时候,会退化成一个指针,如果是二维数组的话,会退化成指向一维数组的指针

    49431

    const关键字的秘密:为什么它不总是像你想象的那样

    该文章讲解了 JavaScript 中 const 关键字的用法以及它的一些特性。该关键字用于创建常量,即一旦赋值之后就不能再修改。但是,使用 const 创建的对象和数组却可以被修改。...文章首先介绍了变量的三种声明方式:var、let 和 const。它解释了这三种方式的区别,以及为什么使用 const 声明常量。...然后,文章深入探讨了“赋值”和“变异”的区别,这是理解 const 的关键。虽然 const 创建的对象和数组。 正文开始 JavaScript 中的 const 关键字用于声明常量。...一个数字和一个数组。当代码运行时,这些数据将被创建并存储在计算机的内存中。 这些程序并不是非常有用。我正在创建一些数据,但我没有访问它的方式!...原来这并不是正确的心理模型。更准确的说法是,数组首先被创建,然后我们将我们的 fruits 标签指向它。

    37520

    C++ 中 extern 数组和指针

    这就说明了数组名是一个地址,而且,还是一个不可修改的常量,完整地说,就是一个地址常量数组名跟枚举常量一样,都属于符号常量数组名这个符号,就代表了那块内存的首地址。注意了!...**不是数组名这个符号的值是那块内存的首地址,而是数组名这个符号本身就代表了首地址这个地址值,它就是这个地址**。这就是数组名属于符号常量的意义所在。...由于数组名是一种符号常量,它是一个右值,而指针,作为变量,却是一个左值,一个右值永远都不是左值,那么,数组名永远都不会是指针!...这里问题就出现了:由于在这个文件中声明的 a 是一个指针变量而不是数组,链接器的行为实际上是把指针 a 自身的地址定位到了另一个 .c 文件中定义的数组首地址之上,而不是我们所希望的把数组的首地址赋予指针...为什么有 include 还需要 extern?

    41500

    JavaScript—ES6的变量声明

    ES6系列–变量声明 ES6系列 ES6系列–变量的解构赋值 let声明变量,const声明常量 var 和 let 、const的区别 作用域 let 和 const 是块级作用域,仅在整个大括号内可见...var 只有全局作用域和函数作用域 为什么需要块级作用域?...const定义常量 //以下内容引自阮一峰老师《ECMAScript 6入门》 const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。...对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。...但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了

    48520

    程序员C语言快速上手——进阶篇(六)

    一旦将数组作为函数的参数,实际上都是将数组的首元素地址复制给了函数的形参,即使你声明的是数组类型的形参也一样。 1 // 形参声明为数组类型:char ch[] ,没用!...2 // 实际上仍然会退化为指针,编译器不允许在函数传参时,对数组内容进行复制操作,无法实现值传递 3 // 因此,ch实际上是一个char *类型的指针而已 4 void convstr(char ch...关于自增运算符,我们在前面的章节长篇大论的讲解了一番,并不是无的放矢,实际上++运算结合指针是很常用的用法,如仍不清楚这里*text++的值,请返回 程序员C语言快速上手——基础篇(三) 算术运算符章节重新学习...,也有人喜欢使用另一种风格来声明指针常量,将星号与const紧挨 1 int n = 7; 2 int *const p1 = &n; 常量指针 常量指针的意思是说指针所指向的内容是个常量。...声明格式:const【指针类型】const 【变量名】 1 int n = 7; 2 int l = 10; 3 4 //声明指向常量常量指针 5 const int* const

    59660

    C++ string中的几个小陷阱,你掉进过吗?

    问题就出在给fr指针分配内存的时候,注意这里用的是C中的malloc而不是new,如果你换成new再运行,就不会报错了,成功的输出“hello”,那为什么malloc就不行呢?...答案是后者,咋一看const char*的值应该是个常量啊,怎么还能改变值呢?哈,又是个经典的面试题:const char*, char const*, char* const的区别是什么?...老生常谈的问题,const char*与char const*是等价的,指的是指向字符常量的指针,即指针可以改变指向但其指向的内容不可以改变,而char* const相反,指的是常量指针,即指向不可以改变但指针指向的内容可以改变...因此这里的const char*指向的内容本类是不可以改变的,那么这里为什么改变了呢?...这跟str这个const char*的生命周期及string类的实现有关,string的c_str()返回的指针是由string管理的,因此它的生命期是string对象的生命期,而string类的实现实际上封装着一个

    2.6K20

    ES6——常量const

    const声明一个只读的常量。一旦声明,常量必须进行初始化且初始化的值就不能改变。...; const age = 30; const本质 const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。...但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了...const a = []; a.push('Hello'); // 可执行 a.length = 0; // 可执行 a = ['Dave']; // 报错 上面代码中,常量a是一个数组,这个数组本身是可写的...,但是如果将另一个数组赋值给a,就会报错。

    54730

    ES6语法学习(let与var区别、块级作用域、const命令)

    .有变量提升 2.没有块级作用域,是函数作用域 3.能重复声明 4.可以重新赋值  let声明变量: 1.没有变量提升 2.有块级作用域 3.不能重复声明 4.可以重新赋值 02-块级作用域 2.1-为什么需要块级作用域...命令 const可以声明一个只读的常量 3.1-一旦声明,常量的值就不能改变 例:下面的代码表明改变常量的值就会报错 const PI = 3.1415; console.log(PI); PI ...){ const MAX = 10; } console.log(MAX);//MAX is not defined 3.4const命令声明的常量也不会提升...//下面两行都会报错 const message = "good"; const age = 40; 3.6-const本质: const实际上保证的并不是变量的值不改动,而是变量指向的内存地址不得改动...但是对于引用类型的数据(对象、数组),变量指向的内存地址保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的这是不能控制的,因此,将一个对象声明为常量时需要非常小心。

    1K00
    领券