五、指针运算。在C中,可以对指针进行移动的运算,如: char a[20]; char *ptr=a; ptr++; ptr+=2; 当执行ptr++;时,编译器会产生让ptr前进sizeof(char)步长的代码,之后,ptr将指向a [1]。ptr+=2;这句使得ptr前进两个sizeof(char)大小的步长。同样,我们来看一下Object Pascal中如何实现: var a : array [1..20] of Char; ptr : PChar; //PChar 可以看作 ^Char begin ptr := @a; Inc(ptr); // 这句等价于 C 的 ptr++; Inc(ptr, 2); //这句等价于 C 的 ptr+=2; end; 六、动态内存分配。C中,使用malloc()库函数分配内存,free()函数释放内存。如这样的代码: int *ptr, *ptr2; int i; ptr = (int*) malloc(sizeof(int) * 20); ptr2 = ptr; for (i=0; i<20; i++){ *ptr = i; ptr++; } free(ptr2); Object Pascal中,动态分配内存的函数是GetMem(),与之对应的释放函数为FreeMem()(传统Pascal中获取内存的函数是New()和 Dispose(),但New()只能获得对象的单个实体的内存大小,无法取得连续的存放多个对象的内存块)。因此,与上面那段C的代码等价的Object Pascal的代码为: var ptr, ptr2 : ^integer; i : integer; begin GetMem(ptr, sizeof(integer) * 20); //这句等价于C的 ptr = (int*) malloc(sizeof(int) * 20); ptr2 := ptr; //保留原始指针位置 for i := 0 to 19 do begin ptr^ := i; Inc(ptr); end; FreeMem(ptr2); end; 对于以上这个例子(无论是C版本的,还是Object Pascal版本的),都要注意一个问题,就是分配内存的单位是字节(BYTE),因此在使用GetMem时,其第二个参数如果想当然的写成 20,那么就会出问题了(内存访问越界)。因为GetMem(ptr, 20);实际只分配了20个字节的内存空间,而一个整形的大小是四个字节,那么访问第五个之后的所有元素都是非法的了(对于malloc()的参数同样)。 |
正在阅读:浅谈Object Pascal的指针浅谈Object Pascal的指针
2004-02-14 09:34
出处:PConline
责任编辑:zwg
键盘也能翻页,试试“← →”键