Pascal中的指针运算指南(与C比较)

Pascal中的指针运算指南(与C比较)

Pascal中的指针运算指南(与C比较)

大家都认为,c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。同时,这种说法也让很多人产生误解,似乎只有c语言的指针才能算指针。basic不支持指针,在此不论。其实,pascal语言本身也是支持指针的。从最初的pascal发展至今的object pascal,可以说在指针运用上,丝毫不会逊色于c语言的指针。

以下内容分为八部分,分别是

一、类型指针的定义

二、无类型指针的定义

三、指针的解除引用

四、取地址(指针赋值)

五、指针运算

六、动态内存分配

七、字符数组的运算

八、函数指针

一、类型指针的定义。对于指向特定类型的指针,在c中是这样定义的:

int *ptr;

char *ptr;

与之等价的object pascal是如何定义的呢?

var

ptr : ^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 *ptr=a;

ptr++;

ptr+=2;

当执行ptr++;时,编译器会产生让ptr前进sizeof(char)步长的代码,之后,ptr将指向a[1]。ptr+=2;这句使得ptr前进两个sizeof(char)大小的步长。同样,我们来看一下object pascal中如何实现:

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

ptr : pchar; //pchar 可以看作 ^char

begin

ptr := @a;inc(ptr); // 这句等价于 c 的 ptr++;

inc(ptr, 2); //这句等价于 c 的 ptr+=2;

end;

只是,pascal中,只允许对有类型的指针进行这样的运算,对于无类型指针是不行的。

六、动态内存分配。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()的参数同样)。

七、字符数组的运算。c语言中,是没有字符串类型的,因此,字符串都是用字符数组来实现,于是也有一套str打头的库函数以进行字符

pascal指针 c语言指针,Pascal中的指针运算指南(与C比较).doc相关推荐

  1. c语言形参指针 实参数组,《C语言程序设计》中的指针形参和函数体中数组实参问题的教学研究.pdf...

    <C语言程序设计>中的指针形参和函数体中数组实参问题的教学研究.pdf C C <CC语言程序设计>中的指针形参和函数体中数组实参问题的教学研究 山东理工大学计算机学院 董敬富 ...

  2. c语言在函数中传递指针,[求助]关于文件指针在函数中传递的问题

    [求助]关于文件指针在函数中传递的问题 我写的一个程序中文件指针在各函数间传递.请各位整理一下思路. /*=============================================== ...

  3. c语言给结构体指针申请空间,结构体中的指针变量申请空间问题

    本人声明了一个结构体包含id,age,name三个属性 struct studentInfo { int id; int age; char *name[20]; }; 本人又创建了一个双向循环链表, ...

  4. php this指针的用法,C#_C#中this指针的用法示例,本文实例展示了C#中this指针的 - phpStudy...

    C#中this指针的用法示例 本文实例展示了C#中this指针的用法,对于初学者进一步牢固掌握C#有很大帮助,具体内容如下: 一.this指针是什么: 这里有一些面向对象编程的概念需要说明:类(Cla ...

  5. java int 指针_如何在Java中使用指针?

    小编典典 Java中的所有对象都是引用,你可以像使用指针一样使用它们. abstract class Animal {... } class Lion extends Animal {... } cl ...

  6. phi函数C语言,Intel Xeon Phi协处理器高性能编程指南 第1章.DOC

    Intel Xeon Phi协处理器高性能编程指南 第1章.DOC PAGE 18 第1章 绪论 STYLEREF \l "标题 2" \* MERGEFORMAT 1.15 超线 ...

  7. C语言调用jni中JNIEnv指针使用和理解

    使用C语言调用jni的时候,需要和java的环境对象和虚拟机对象交互.它们的C语言定义如下. typedef const struct JNINativeInterface* JNIEnv; type ...

  8. this指针 java_彻底理解Java中this指针

    每次看到Java中的this指针,总摸不着头绪.在网上看了很多人的讲解,还是不知道this指针到底是什么东西,今天的的这篇日志可以让你看清this到底是谁.(内容摘自:http://www.mathc ...

  9. 共享内存中使用指针_详解c++中字符指针数组的使用

    之前有写过一篇叫c++中动态数组的使用,今来看看c++中的字符指针数组的使用. 涛哥:c++中的动态数组使用​zhuanlan.zhihu.com 指针数组,就指向指针的指针,很早以前在说指针的时候说 ...

最新文章

  1. python中pow是什么函数_python中pow什么意思
  2. 提醒ASP.NET的初学者们注意加深以下方面的技术了解
  3. 如何加入Dave英语学习小组
  4. 防雷检测仪器设备清单 万佳防雷检测机构 一类建筑物避雷验收
  5. JAVA和遮掩_JAVA 你不知道的秘密 覆写,重载,隐藏,遮蔽,遮掩
  6. 微服务的时间和成本去哪儿了
  7. C#拼装JSON数组简易方法
  8. java restful文件传输_java中使用restful web service来传输文件
  9. 记录一次JDK版本问题,引发的思考
  10. 转 OFBiz财务模型-金融账户
  11. BUUCTF-神秘龙卷风
  12. elementui实现横向时间轴_element ui step组件在另一侧加时间轴显示
  13. 区分 J2SE 和 J2EE
  14. linux deploy 搭建(一)安装linux deploy
  15. Golang sort包Search函数源码分析
  16. 基于SEIR模型的网络医疗众筹传播建模与仿真分析
  17. (用函数解决)Python报数游戏,输入有n个人按顺序编号,从第一个人报数,输入报数k,从1到k,报到k的退出游戏,从下一个人继续游戏,并求最后剩下的人编号是几号。
  18. 谈谈 Bias-Variance Tradeoff
  19. libnet编译linux,Linux 网络编程—— libnet 使用指南
  20. 论文翻译 || openpose -- Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields

热门文章

  1. seo原创工具_网站seo需要用到哪些工具,seo工具大全
  2. 公司印章管理中必须要知道的23个法律问题
  3. 准确率(Precision)、召回率(Recall)以及F值(F-Measure)
  4. 商城项目 pc----商品详情页
  5. BZOJ P2150 部落战争
  6. 小半计算机谱子,小半 钢琴谱-陈粒
  7. 遍历列表python_Python-遍历列表中的每两个元素
  8. Openlayers中加载GeoJson文件显示地图
  9. SAS软件sid最新
  10. 超市会员管理系统实战项目