pascal指针 c语言指针,Pascal中的指针运算指南(与C比较).doc
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相关推荐
- c语言形参指针 实参数组,《C语言程序设计》中的指针形参和函数体中数组实参问题的教学研究.pdf...
<C语言程序设计>中的指针形参和函数体中数组实参问题的教学研究.pdf C C <CC语言程序设计>中的指针形参和函数体中数组实参问题的教学研究 山东理工大学计算机学院 董敬富 ...
- c语言在函数中传递指针,[求助]关于文件指针在函数中传递的问题
[求助]关于文件指针在函数中传递的问题 我写的一个程序中文件指针在各函数间传递.请各位整理一下思路. /*=============================================== ...
- c语言给结构体指针申请空间,结构体中的指针变量申请空间问题
本人声明了一个结构体包含id,age,name三个属性 struct studentInfo { int id; int age; char *name[20]; }; 本人又创建了一个双向循环链表, ...
- php this指针的用法,C#_C#中this指针的用法示例,本文实例展示了C#中this指针的 - phpStudy...
C#中this指针的用法示例 本文实例展示了C#中this指针的用法,对于初学者进一步牢固掌握C#有很大帮助,具体内容如下: 一.this指针是什么: 这里有一些面向对象编程的概念需要说明:类(Cla ...
- java int 指针_如何在Java中使用指针?
小编典典 Java中的所有对象都是引用,你可以像使用指针一样使用它们. abstract class Animal {... } class Lion extends Animal {... } cl ...
- phi函数C语言,Intel Xeon Phi协处理器高性能编程指南 第1章.DOC
Intel Xeon Phi协处理器高性能编程指南 第1章.DOC PAGE 18 第1章 绪论 STYLEREF \l "标题 2" \* MERGEFORMAT 1.15 超线 ...
- C语言调用jni中JNIEnv指针使用和理解
使用C语言调用jni的时候,需要和java的环境对象和虚拟机对象交互.它们的C语言定义如下. typedef const struct JNINativeInterface* JNIEnv; type ...
- this指针 java_彻底理解Java中this指针
每次看到Java中的this指针,总摸不着头绪.在网上看了很多人的讲解,还是不知道this指针到底是什么东西,今天的的这篇日志可以让你看清this到底是谁.(内容摘自:http://www.mathc ...
- 共享内存中使用指针_详解c++中字符指针数组的使用
之前有写过一篇叫c++中动态数组的使用,今来看看c++中的字符指针数组的使用. 涛哥:c++中的动态数组使用zhuanlan.zhihu.com 指针数组,就指向指针的指针,很早以前在说指针的时候说 ...
最新文章
- python中pow是什么函数_python中pow什么意思
- 提醒ASP.NET的初学者们注意加深以下方面的技术了解
- 如何加入Dave英语学习小组
- 防雷检测仪器设备清单 万佳防雷检测机构 一类建筑物避雷验收
- JAVA和遮掩_JAVA 你不知道的秘密 覆写,重载,隐藏,遮蔽,遮掩
- 微服务的时间和成本去哪儿了
- C#拼装JSON数组简易方法
- java restful文件传输_java中使用restful web service来传输文件
- 记录一次JDK版本问题,引发的思考
- 转 OFBiz财务模型-金融账户
- BUUCTF-神秘龙卷风
- elementui实现横向时间轴_element ui step组件在另一侧加时间轴显示
- 区分 J2SE 和 J2EE
- linux deploy 搭建(一)安装linux deploy
- Golang sort包Search函数源码分析
- 基于SEIR模型的网络医疗众筹传播建模与仿真分析
- (用函数解决)Python报数游戏,输入有n个人按顺序编号,从第一个人报数,输入报数k,从1到k,报到k的退出游戏,从下一个人继续游戏,并求最后剩下的人编号是几号。
- 谈谈 Bias-Variance Tradeoff
- libnet编译linux,Linux 网络编程—— libnet 使用指南
- 论文翻译 || openpose -- Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields