网站手机端和电脑端,网站下一步工作怎么做,长清网站建设,企业网站长度大家都认为#xff0c;C语言之所以强大#xff0c;以及其自由性#xff0c;很大部分体现在其灵活的指针运用上。因此#xff0c;说指针是C语言的灵魂#xff0c;一点都不为过。同时#xff0c;这种说法也让很多人产生误解#xff0c;似乎只有C语言的指针才能算指针。Bas…大家都认为C语言之所以强大以及其自由性很大部分体现在其灵活的指针运用上。因此说指针是C语言的灵魂一点都不为过。同时这种说法也让很多人产生误解似乎只有C语言的指针才能算指针。Basic不支持指针在此不论。其实Pascal语言本身也是支持指针的。从最初的Pascal发展至今的Object Pascal可以说在指针运用上丝毫不会逊色于C语言的指针。以下内容分为八个部分分别是一、类型指针的定义二、无类型指针的定义三、指针的解除引用四、取地址指针赋值五、指针运算六、动态内存分配七、字符数组的运算八、函数指针一、类型指针的定义。对于指向特定类型的指针在C中是这样定义的int *ptr;char *ptr;与之等价的Object Pascal是如何定义的呢varptr : ^Integer;ptr : ^char;其实也就是符号的差别而已。二、无类型指针的定义。C中有void *类型也就是可以指向任何类型数据的指针。Object Pascal为其定义了一个专门的类型Pointer。于是ptr : Pointer;就与C中的void *ptr;等价了。三、指针的解除引用。要解除指针引用即取出指针所指区域的值C 的语法是 (*ptr)Object Pascal则是 ptr^。四、取地址指针赋值。取某对象的地址并将其赋值给指针变量C 的语法是ptr Object;Object Pascal 则是ptr : Object;也只是符号的差别而已。五、指针运算。在C中可以对指针进行移动的运算如char a[20];char *ptra;ptr;ptr2;当执行ptr;时编译器会产生让ptr前进sizeof(char)步长的代码之后ptr将指向a[1]。ptr2;这句使得ptr前进两个sizeof(char)大小的步长。同样我们来看一下Object Pascal中如何实现vara : array [1..20] of Char;ptr : PChar; //PChar 可以看作 ^Charbeginptr : a;Inc(ptr); // 这句等价于 C 的 ptr;Inc(ptr, 2); //这句等价于 C 的 ptr2;end;六、动态内存分配。C中使用malloc()库函数分配内存free()函数释放内存。如这样的代码int *ptr, *ptr2;int i;ptr (int*) malloc(sizeof(int) * 20);ptr2 ptr;for (i0; i20; i){*ptr i; ptr; }free(ptr2);Object Pascal中动态分配内存的函数是GetMem()与之对应的释放函数为FreeMem()传统Pascal中获取内存的函数是New()和 Dispose()但New()只能获得对象的单个实体的内存大小无法取得连续的存放多个对象的内存块。因此与上面那段C的代码等价的 Object Pascal的代码为var ptr, ptr2 : ^integer;i : integer;beginGetMem(ptr, sizeof(integer) * 20);//这句等价于C的 ptr (int*) malloc(sizeof(int) * 20);ptr2 : ptr; //保留原始指针位置for i : 0 to 19 dobeginptr^ : i;Inc(ptr);end;FreeMem(ptr2);end;对于以上这个例子无论是C版本的还是Object Pascal版本的都要注意一个问题就是分配内存的单位是字节BYTE因此在使用GetMem时其第二个参数如果想当然的写成 20那么就会出问题了内存访问越界。因为GetMem(ptr, 20);实际只分配了20个字节的内存空间而一个整形的大小是四个字节那么访问第五个之后的所有元素都是非法的了对于malloc()的参数同样。七、字符数组的运算。C语言中是没有字符串类型的因此字符串都是用字符数组来实现于是也有一套str打头的库函数以进行字符数组的运算如以下代码char str[15];char *pstr;strcpy(str, teststr);strcat(str, _testok);pstr (char*) malloc(sizeof(char) * 15);strcpy(pstr, str);printf(pstr);free(pstr);而在Object Pascal中有了String类型因此可以很方便的对字符串进行各种运算。但是有时我们的Pascal代码需要与C的代码交互比如用 Object Pascal的代码调用C写的DLL或者用Object Pascal写的DLL准备允许用C写客户端的代码的话就不能使用String类型了而必须使用两种语言通用的字符数组。其实Object Pascal提供了完全相似C的一整套字符数组的运算函数以上那段代码的Object Pascal版本是这样的var str : array [1..15] of char;pstr : PChar; //Pchar 也就是 ^CharbeginStrCopy(str, teststr); //在C中数组的名称可以直接作为数组首地址指针来用//但Pascal不是这样的因此 str前要加上取地址的运算符StrCat(str, _testok);GetMem(pstr, sizeof(char) * 15);StrCopy(pstr, str);Write(pstr);FreeMem(pstr);end;八、函数指针。在动态调用DLL中的函数时就会用到函数指针。假设用C写的一段代码如下typedef int (*PVFN)(int); //定义函数指针类型int main(){ HMODULE hModule LoadLibrary(test.dll);PVFN pvfn NULL;pvfn (PVFN) GetProcAddress(hModule, Function1);pvfn(2);FreeLibrary(hModule); }就我个人感觉来说C语言中定义函数指针类型的typedef代码的语法有些晦涩而同样的代码在Object Pascal中却非常易懂type PVFN Function (para : Integer) : Integer;varfn : PVFN;//也可以直接在此处定义如fn : function (para:Integer):Integer;hm : HMODULE;beginhm : LoadLibrary(test.dll);fn : GetProcAddress(hm, Function1);fn(2);FreeLibrary(hm);end;转载于:https://www.cnblogs.com/yuezh/archive/2012/06/15/2550968.html