跳到主要內容

在 Delphi 中,指针(Pointer)是一种非常强大的工具

 在 Delphi 中,指针(Pointer)是一种非常强大的工具,可以直接操作内存地址。这些指针主要用于需要高效或特定内存操作的场景。以下是一些常见的指针使用示例,包括基本用法、动态内存分配以及数组和记录的操作。


### 基本指针用法


```delphi

procedure BasicPointerExample;

var

  Ptr: ^Integer;

  Value: Integer;

begin

  Value := 42;

  Ptr := @Value; // 获取变量 Value 的地址

  ShowMessage(IntToStr(Ptr^)); // 显示 Ptr 指向的值,即 42

end;

```


### 动态内存分配


```delphi

procedure DynamicMemoryAllocationExample;

var

  Ptr: ^Integer;

begin

  // 动态分配内存

  New(Ptr);

  Ptr^ := 42; // 设置 Ptr 指向的内存的值

  ShowMessage(IntToStr(Ptr^)); // 显示 Ptr 指向的值,即 42

  Dispose(Ptr); // 释放内存

end;

```


### 操作数组


```delphi

procedure ArrayPointerExample;

var

  Arr: array[1..5] of Integer;

  Ptr: ^Integer;

  I: Integer;

begin

  // 初始化数组

  for I := 1 to 5 do

    Arr[I] := I * 10;


  // 获取数组的指针

  Ptr := @Arr[1];


  // 通过指针访问数组

  for I := 0 to 4 do

    ShowMessage(IntToStr((Ptr + I)^)); // 显示 10, 20, 30, 40, 50

end;

```


### 操作记录


```delphi

type

  TMyRecord = record

    Age: Integer;

    Name: string;

  end;

  PMyRecord = ^TMyRecord;


procedure RecordPointerExample;

var

  Rec: TMyRecord;

  Ptr: PMyRecord;

begin

  Rec.Age := 30;

  Rec.Name := 'John Doe';


  Ptr := @Rec; // 获取记录的指针


  ShowMessage(IntToStr(Ptr^.Age)); // 显示 30

  ShowMessage(Ptr^.Name); // 显示 John Doe

end;

```


### 使用 `GetMem` 和 `FreeMem` 分配和释放内存


```delphi

procedure GetMemFreeMemExample;

var

  Ptr: Pointer;

  Value: Integer;

begin

  // 分配内存

  GetMem(Ptr, SizeOf(Integer));

  Integer(Ptr^) := 42; // 设置 Ptr 指向的内存的值

  Value := Integer(Ptr^);

  ShowMessage(IntToStr(Value)); // 显示 42

  // 释放内存

  FreeMem(Ptr);

end;

```


### 字符串操作


```delphi

procedure StringPointerExample;

var

  Str: string;

  Ptr: PChar;

begin

  Str := 'Hello, Delphi!';

  Ptr := PChar(Str); // 获取字符串的指针


  while Ptr^ <> #0 do

  begin

    ShowMessage(Ptr^); // 显示每个字符

    Inc(Ptr); // 移动到下一个字符

  end;

end;

```


以上示例展示了如何在 Delphi 中使用指针来操作不同类型的数据。使用指针时需特别注意内存管理,以避免内存泄漏或访问无效内存。

留言

這個網誌中的熱門文章

GSR600 TPS ( Throttle Position Sensor) adjustment

FI MODE DEALER MODE (FI MODE code ) BLACK W/ GREEN BAND Wire with a WHITE STRIPE and a WHITE W/ GREEN BAND Wire with a RED STRIPE 黑底白細條 白底紅細條 短路後 就可以看 FI code了 C11 - Camshaft position sensor (CMPS) C12 - Crankshaft position sensor (CKPS) Pick-up coil signal, signal generator C13 - Intake air pressure sensor (IAPS) C14 - THROTTLE POSITION SENSOR C15 - ENGINE COOLANT TEMPERATURE SENSOR C21 - INTAKE AIR TEMPERATURE SENSOR C22 - ATMOSPHERIC PRESSURE SENSOR C23 - TIPOVER SENSOR C24 - IGNITION SIGNAL #1 C25 - IGNITION SIGNAL #2 C26 - IGNITION SIGNAL #3 C27 - IGNITION SIGNAL #4 C28 - SECONDARY THROTTLE VALVE ACTUATOR C29 - SECONDARY THROTTLE POSITION SENSOR C30 - SECONDARY THROTTLE CONTROL UNIT C31 - GEAR POSITION SENSOR C32 - INJECTOR SIGNAL #1 C33 - INJECTOR SIGNAL #2 C34 - INJECTOR SIGNAL #3 C35 - INJECTOR SIGNAL #4 C41 - FUEL PUMP CONTROL SYSTEM C42 - IGNITION SWITCH SIGNAL C44 - HO2 sensor C49 - PAIR control solenoid valve C60 - Cooling fan control system ( Cooling fan relay) TP SENSOR A...

重機 隱藏式大燈開關

重機 隱藏式大燈開關 剛剛裝到我的 GSR600 達到預期效果!! 還不錯 GSR600 電門開啟. 大燈沒點亮. 發動後 按一下 PASS 燈(遠光閃光) 就啟動近燈. 近燈就恒亮. 如果要關掉近燈 就按一下 發動紐. (GSR600 電發紐 是有玄機的GSR 要發動 必須抓離合器 並同時按發動紐 GSR 才會啟動發動馬達. 如果你只是按發動紐 他只會將燈的部分斷電,並不會啟動發動馬達 ) 大燈隱藏開關就是利用這個原理 用pass 燈啟動 近燈. 利用發動紐 關掉進燈. 電路中的二極體就是讓pass燈訊號啟動繼電器線圈. 開啟進燈. 當近燈開啟 另一顆接在近燈的二極體也跟著啟動.讓繼電器線圈保持啟動. 近燈就會恆亮. 如果想要關掉近燈. 就按發動紐一下. 就可以把近燈斷電. ...

MTF 50 & MTF 30 與 Edge profile (Linear) 之間的關係

解答來自於 Grok 2 Q: MTF 50 & MTF 30 的計算方式. 如果知道 一張 1080p 的照片 黑白 由 10% ~90% 需要1.5 個pixel. 這樣 MTF50 & MTF30 推算是多少? A: MTF (Modulation Transfer Function)是一種用來衡量光學系統對於不同空間頻率的解析度或對比度保持能力的指標。MTF50 和 MTF30 分別表示在50%和30%的對比度時所對應的空間頻率。 你給的資訊說明了一張1080p黑白照片在對比度從10%到90%時需要1.5個像素來表達一個周期。我們可以利用這個資訊來估算MTF50和MTF30的數值: 1. **MTF的定義**:MTF描述了從一個完美信號到通過光學系統後的信號的衰減程度。對比度衰減到50%時,我們說這個頻率是MTF50;對比度衰減到30%時,我們說這個頻率是MTF30。 2. **像素與空間頻率的關係**:    - 一個周期(一個黑白交替的單位)需要1.5個像素,則一個周期的空間頻率可以表示為:       - 1080p分辨率,垂直方向有1080像素,所以最高空間頻率約為:    - 這裡假設我們談論的是垂直方向的頻率。 3. **估算MTF50和MTF30**:    - 由於你的資訊是從10%到90%的對比度需要1.5像素,我們需要假設對比度是線性下降的:      - **MTF50**:對比度降至50%,假設這是線性關係,我們需要找出一半的對比度(50%)所對應的像素數。既然1.5像素是從10%到90%,50%的地方應該是在:        所以,MTF50大約對應於:        (這個值應該 還要除以2 ) 才是cycle      - **MTF30**:對比度降至30%:              所以,MTF30大約對應於: 請注意, 這是一個簡化和估算的過程 ,實際的MTF測量可能需要更複雜的計算和實驗數據來確定,...