Pointers 如何在不强制转换的情况下使用指向字符串数组的指针

Pointers 如何在不强制转换的情况下使用指向字符串数组的指针,pointers,pascal,lazarus,Pointers,Pascal,Lazarus,选项1和2运行良好,但我不喜欢使用“TArrayString()”,我宁愿使用类似选项3的东西(它不工作) 输出如下所示: 1) Void Pointer + Cast: senal101 senal102 senal103 2) TArrayString Pointer + Cast: senal101 senal102 senal103 3) TArrayString Pointer + NO Cast: => Not working!! 有可能吗?基于@David Heffer

选项1和2运行良好,但我不喜欢使用“TArrayString()”,我宁愿使用类似选项3的东西(它不工作)

输出如下所示:

1) Void Pointer + Cast:
senal101
senal102
senal103

2) TArrayString Pointer + Cast:
senal101
senal102
senal103

3) TArrayString Pointer + NO Cast: => Not working!!

有可能吗?

基于@David Hefferman answers,我已经完成了代码更新,我不确定这是否是正确的答案,但至少是一种可能的选择

似乎:

  • 指向静态数组(信号)的动态数组指针(^TArrayString)可以执行此任务,但方式不正确
  • 使用指向静态数组(信号)的静态数组指针(^TArrayStringStatic)以正确的方式执行任务,无需强制转换(第5点)
节目:

program project1;
type TArrayString = array of string;
type TArrayStringStatic = array [0..65535] of string;

const
   n_signals = 3;
var
   signals      : array [1..n_signals] of string = ('10199999999', '102', '103777777');
   i            :integer;
   ptr_signals_void : pointer;
   ptr_signals_dyn  : ^TArrayString;
   ptr_signals_stat : ^TArrayStringStatic;
begin

  ptr_signals_void  := @signals;
  ptr_signals_dyn   := @signals;
  ptr_signals_stat  := @signals;

  WriteLn('1) Void Pointer + Cast (Dynamic Array):');
  for i:=0 to n_signals-1 do begin
    writeLn('senal' + TArrayString(ptr_signals_void)[i]);
  end;
  WriteLn('');

  WriteLn('2) TArrayString Pointer + Cast (Dynamic Array):');
  for i:=0 to n_signals-1 do begin
    writeLn('senal' + TArrayString(ptr_signals_dyn)[i]);
  end;
  WriteLn('');

  WriteLn('3) TArrayString Pointer + NO Cast: => Not working!!');
  for i:=0 to n_signals-1 do begin
    //writeLn('senal' + ptr_signals_dyn^[i]);          // ¿¿why not??
    //writeLn('senal' + string(ptr_signals_dyn[i]));   // Works
  end;
  WriteLn('');

  WriteLn('4) TArrayStringStatic Pointer + Cast (Static Array):');
  for i:=0 to n_signals-1 do begin
    writeLn('senal' + TArrayStringStatic(ptr_signals_stat^)[i]);
  end;
  WriteLn('');

  WriteLn('5) TArrayStringStatic Pointer + No Cast:');
  for i:=0 to n_signals-1 do begin
    writeLn('senal' + ptr_signals_stat^[i]);
  end;
  WriteLn('');

end. 
输出:

1) Void Pointer + Cast (Dynamic Array):
senal10199999999
senal102
senal103777777

2) TArrayString Pointer + Cast (Dynamic Array):
senal10199999999
senal102
senal103777777

3) TArrayString Pointer + NO Cast: => Not working!!

4) TArrayStringStatic Pointer + Cast (Static Array):
senal10199999999
senal102
senal103777777

5) TArrayStringStatic Pointer + No Cast:
senal10199999999
senal102
senal103777777

谢谢。

动态数组和固定长度数组不是一回事。你的前两个工作,但出于偶然。他们不正确。第三个选项不起作用,因为动态数组变量是指向数组的指针,所以ptr_signals2持有一个双指针,但您分配了一个指针。而且您还没有启用类型化地址,因此实际上您有一个强制转换,编译器无法保存您。我不知道你的目标是什么,所以我不能建议如何最好地实现这个目标。1)我有许多“信号”数组,每次我都要在其中一个数组上执行相同的过程。因此,如果每次都能使用相同的代码并选择一个数组,那就太好了。2) 哪一种方法是正确的,可以使前两种方法有效(但不是偶然的)。谢谢。而“signals”数组是全局变量,所以通过ref将它们传递给函数似乎不是最好的选择。您谈论的正确方式可能是:parray:array[1..MAX]of ^string;对于i:=1到MAX do parray[i]:=@names[i];但是我不喜欢它,因为它太长了。不,他们工作是偶然的。转换为动态数组是错误的,因为转换的结构不是动态数组。
1) Void Pointer + Cast (Dynamic Array):
senal10199999999
senal102
senal103777777

2) TArrayString Pointer + Cast (Dynamic Array):
senal10199999999
senal102
senal103777777

3) TArrayString Pointer + NO Cast: => Not working!!

4) TArrayStringStatic Pointer + Cast (Static Array):
senal10199999999
senal102
senal103777777

5) TArrayStringStatic Pointer + No Cast:
senal10199999999
senal102
senal103777777