delphi 常量数组赋值给变量数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 常量数组赋值给变量数组相关的知识,希望对你有一定的参考价值。

请问下面赋值有什么问题,为什么会有Incompatible types错误呢?
procedure TForm1.FormCreate(Sender: TObject);
const a: array [0..3] of char = (#1,#1,#1,#1);
var
b : array [0..3] of char;
begin
b := a; // Incompatible types
end;

delphi(pascal)本身不支持高级别的矩阵运算,只能对矩阵或数组里的单个元素进行处理。
procedure TForm1.Button1Click(Sender: TObject);
const a:array[0..3] of char=(#1,#1,#1,#1);
var
  b : array [0..3] of char;
  i:integer;
begin
  for i:=0 to 3 do b[i]:=a[i];
end;

参考技术A delphi 没有b := a; 这种方式,要用循环才能处理 参考技术B 动态数组的使用
//例1:
var
StrArr: array of String; //动态数组定义时不与维数
begin
SetLength(StrArr,6); //分配6个元素位置: 0-5
StrArr[0] := '万一'; //动态数组的下界是 0
ShowMessage(StrArr[0]); //分配空间后和静态数组一样使用
StrArr := nil; //一般没必要手动释放, 动态数组离开作用域会自释放
end;
--------------------------------------------------------------------------------

//例2. 动态数组的引用:
var
Arr1,Arr2: array of Integer;
a: array[0..1] of Integer;
begin
SetLength(Arr1,6);
Arr1[5] := 100;

Arr2 := Arr1; //Arr2 引用了 Arr1
ShowMessage(IntToStr(Arr2[5])); //100
ShowMessage(IntToStr(Length(Arr2))); //当然 Arr2 维数也会是 6

ShowMessage(IntToStr(SizeOf(Arr1))); //4, 其实动态数组是个指针
ShowMessage(IntToStr(SizeOf(Arr2))); //4

Arr2[5] := 99; //现在它们指向同一个数组, 改变这个就是改变那个
ShowMessage(IntToStr(Arr1[5])); //99

Arr1 := nil; //释放其中一个指针, 数组继续存在
ShowMessage(IntToStr(Arr2[5])); //99
end;
--------------------------------------------------------------------------------

//例3. 数组 Copy <1>:
var
Arr1,Arr2: array of Integer;
begin
SetLength(Arr1,6);
Arr1[5] := 100;

Arr2 := Copy(Arr1); //数组 Copy
Arr2[5] := 99; //改变 Arr2 不再影响 Arr1
ShowMessage(IntToStr(Arr1[5]-Arr2[5])); //1

SetLength(Arr1,7);
ShowMessage(IntToStr(Length(Arr1))); //7
ShowMessage(IntToStr(Length(Arr2))); //6, 没有一点牵扯了
end;
--------------------------------------------------------------------------------

//例4. 数组 Copy <2>:
var
Arr1,Arr2: array of Integer;
i: Integer;
begin
SetLength(Arr1,6);
for i := Low(Arr1) to High(Arr1) do //给每个元素赋值
Arr1[i] := i+1;

Arr2 := Copy(Arr1,1,3); //只 Copy 第2..4个元素

ShowMessage(IntToStr(Arr1[1])); //2, 现在 Arr2[0] 和 Arr1[1] 的值是一样的
ShowMessage(IntToStr(Arr2[0])); //2

ShowMessage(IntToStr(Length(Arr1))); //6, 维数肯定不一样了
ShowMessage(IntToStr(Length(Arr2))); //3
end;
--------------------------------------------------------------------------------

//例5. 动态多维数组:
var
Arr: array of array of Integer; //定义多维数组
begin
SetLength(Arr,5,5); //分配空间
Arr[0,3] := 100; //赋值
ShowMessage(IntToStr(Arr[0,3])); //取值
end;
--------------------------------------------------------------------------------

//例6. 另类建立:
var
Arr: array of Integer;
begin
Arr := varArrayCreate([0,3],varInteger);
ShowMessage(IntToStr(Length(Arr))); //4

Arr := VarArrayOf([1,2,3,4]);

ShowMessage(IntToStr(Arr[0])); //1
这是给变体数组使用的,可能会有效率问题
end;

5数组指针和引用:数组

  • 数组
    • 一维数组:数据类型  数组名 [常量表达式] 
      • 注意:
        • 命名规则和变量名相同
        • 数组后面一定是[],方括号内 是常量表达式
        • 常量表达式表达元素的个数,即数组的长度 
        • 定义数组的常量表达式不能是变量
      • 引用:
        • 一维数组引用的一般形式:数组名[下标]
        • 数组元素的下标起始值为0
      • 初始化:
        • 单个元素逐一赋值   a[10]=1;a[9]=100;......
        • 聚合方式赋值   
          • int a[10]={1,2,.....10} ;
          • int a[]={1,2,.....10}  ; 
          • int a[10]={1,2,.....7} 没被赋值的元素 默认补0 
    • 二维数组:数据类型 数组名[常量表达式1][常量表达式2] 
      • 注意:
        • 数组名按照标识符命名
        • 二维数组有两个下标 a[3][4]
        • 下标一定是整数a[3][4]表示有12个元素
        • 声明的时候 下标不能是变量 
        • 一维数组:连续的内存单位进行排序  二维数组:存储形式与一维相同 
      • 引用:
        • 数组名[下标][下标]
        • 起始值从0开始
      • 初始化:
        • 单一元素逐一赋值
        • 聚合方式赋值

          • int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

          • int a[3][4]={1,2,3,4} 后面补0;

          • int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}

    • 字符数组:char 数组名 [常量表达式] 

       

      • 初始化:
        • 聚合方式 
          • char a[11]={‘H‘,‘E‘,‘L‘,‘L‘,‘O‘}未赋值的 补  ;
          • a[]={‘H‘,‘E‘,‘L‘,‘L‘,‘O‘}  默认开辟六个内存单元,因为有个
        • 直接赋字符串 char a[]="fdsgfdsgds"
      • 注意:
        • 聚合方式初始化,只能在数组声明的时候使用,其他时候不可以用聚合方式初始化
        • 声明两个不同的数组  char a[];char b[];   a=b(不可以); b[0]=a[0] 可以

以上是关于delphi 常量数组赋值给变量数组的主要内容,如果未能解决你的问题,请参考以下文章

delphi中的数组赋值

delphi怎么把一维数组赋值给memo delphi

delphi 整型赋值为字节,

Delphi 中,Byte数组如何赋值呢?

delphi中能不能把一维数组作为一个元素赋值给另外一个数组?

delphi二维数组定义 赋值