Talking about Object Pascal's pointer

xiaoxiao2021-03-06  73

Talking about Object Pascal's pointer

Nicrosoft (Nicrosoft@sunistudio.com) 2001.8.26

(

http://www.sunistudio.com/nicrosoft/

East day documentation:

http://www.sunistudio.com/asp/sunidoc.asp)

Everyone believes that the C language is powerful, and its freedom is reflected in its flexible pointer. Therefore, it is said that the pointer is the soul of the C language. At the same time, this statement also makes many people misunderstand that only the C language pointer can be considered. BASIC does not support pointers, here in this regard. In fact, the Pascal language itself is also supporting pointers. Object Pascal from the initial Pascal to this day, can be said to be in the pointer, not inferior to the C language pointer.

The following content is divided into eight parts, respectively

First, the definition of type pointer

Second, the definition of non-type pointer

Third, the release of the pointer

Fourth, take the address (the pointer assignment)

Five, pointer operation

6. Dynamic memory allocation

Seven, the operation of the character array

Eight, function pointer

First, the definition of type pointer. For a specific type of pointer, it is defined in C:

INT * PTR;

Char * PTR;

How is the equivalent Object Pascal defined?

VAR

PTR: ^ integer;

PTR: ^ char;

In fact, it is the difference in symbols.

Second, there is no definition of type pointer. There is a void * type in c, which is to point to pointers of any type of data. Object Pascal defines a special type: Pointer. then,

PTR: POINTER;

In c

Void * PTR;

Equivalent.

Third, the release of the pointer. To release the pointer reference (ie, the value of the area refers to the area refers to the pointer), the syntax of C is (* PTR), Object Pascal is Ptr ^.

Fourth, take the address (the pointer assignment). Take an object's address and assign it to the pointer variable, the syntax of C is

PTR = & object;

Object Pascal is

PTR: = @Object;

It is only the difference in symbols.

Five, pointer operation. In C, the computing can be moved, such as:

Char a [20];

Char * ptr = a;

PTR ;

PTR = 2;

When PTR is performed; the compiler generates code that allows PTR to advance the sizeof (char) step, then PTR will point to A [1]. PTR = 2; This sentence makes the PTR forward into two SizeOf (char) steps. Similarly, let's take a look at how the object pascal implements:

VAR

A: array [1..20] of char;

PTR: PCHAR; // pchar can be seen as ^ char

Begin

PTR: = @A;

Inc (PTR); // This sentence is equivalent to PTR ;

Inc (PTR, 2); // This sentence is equivalent to PTR = 2;

END;

Sixth, dynamic memory allocation. C, use the malloc () library function to allocate memory, free () function releases memory. Such a code:

INT * PTR, * PTR2;

INT I;

PTR = (int *) malloc (sizeof (int) * 20);

PTR2 = PTR;

For (i = 0; i <20; i ) {

* PTR = I; PTR ;

}

Free (PTR2);

In Object Pascal, the function of dynamically assigning the memory is getMem (), and the corresponding release function is freeMem () (more functions in traditional pascal is new () and dispose (), but new () can only get the object The memory size of a single entity cannot obtain a continuous memory block of multiple objects. Therefore, the code equivalent to the code equivalent of the C code above is:

VAR PTR, PTR2: ^ integer;

i: integer;

Begin

GetMem (PTR, SIZEOF (Integer);

// This sentence is equivalent to PTR = (int *) malloc (sizeof (int * 20);

Ptr2: = Ptr; // Reserved the original pointer position

For i: = 0 to 19 do

Begin

PTR ^: = I;

Inc (PTR);

END;

FreeMem (PTR2);

END;

For the above example (whether C versions, or Object Pascal version), pay attention to a problem, that is, the unit allocated memory is byte, so when using getMem, if the second parameter is of course Write into 20, then there will be a problem (memory access crosses). Because GetMem (PTR, 20); actually only assigned 20 bytes of memory space, and a shaping size is four bytes, then all elements after accessing the fifth are illegal (for malloc () The parameters are the same).

7. The operation of the character array. In the C language, there is no string type, so the strings are implemented with a character number, so there is also a set of STR header library functions to perform the array of characters, such as the following code:

Char Str [15];

CHAR * PSTR;

STRCPY (STR, "Teststr");

STRCAT (STR, "_Testok");

PSTR = (char *) Malloc (sizeof (char) * 15);

STRCPY (PSTR, STR);

Printf (PSTR);

Free (PSTR);

In Object Pascal, there is a String type, so it can make a variety of computments for strings. However, sometimes our Pascal code needs to interact with C (such as: Call C written with the CSCAL code, or written with the CSCAL, you can use the Cerect Pascal code), you cannot use the String type. And you must use two languages ​​universal characters. In fact, Object Pascal provides an operational function of a completely similar C, the Object Pascal version of the above code is:

Var Str: array [1..15] of char;

PSTR: PCHAR; // pchar is also ^ char

Begin

Strcopy (@str, 'teststr'); // In C, the name of the array can be used directly as the first address pointer

/ / But Pascal is not like this, so before the STR is adding the operator to take the address.

STRCAT (@str, '_testok');

GetMem (PSTR, SIZEOF (CHAR) * 15);

Strcopy (PSTR, @str);

Write (PSTR); FreeMem (PSTR);

END;

Eight, function pointer. When a function in Dynamic calls the DLL, the function pointer is used. Assume that a code written with C is as follows:

typedef int (* pvfn) (int); // Define function pointer type

int main ()

{

HModule Hmodule = loadingLibrary ("Test.dll");

PVFN PVFN = NULL;

PVFN = (PVFN) GetProcaddress (HMODULE, "Function1");

PVFN (2);

Freelibrary (hmodule);

}

As far as I personally feel, the syntax of the TypeDef code that defines the function pointer type in the C language, and the same code is very easy to understand in Object Pascal:

TYPE PVFN = Function (Para: Integer): Integer;

VAR

FN: PVFN;

// can also be defined herein, such as: Fn: Function (Para: Integer): Integer;

HM: hmodule;

Begin

HM: = loadingLibrary ('Test.dll');

Fn: = getProcaddress (HM, 'Function1');

Fn (2);

Freelibrary (HM);

END;

转载请注明原文地址:https://www.9cbs.com/read-92007.html

New Post(0)