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 指针数组,就指向指针的指针,很早以前在说指针的时候说 ...
最新文章
- 一些查阅个人隐私信息的网站——国内的基本上都查不到
- golang完成聊天室功能
- OpenCV cv2.putText实现字符串换行'\n'
- 漫步ASP.NET MVC的处理管线
- 以数据库思维理解区块链
- 历史数据导出excel_在数据产品中对导出功能的思考
- 游戏情境设计案例精选
- 用最简单的道理说服别人,提升自己
- 项目进度管理表模板_IT项目进度管理—你能驾驭的项目节奏
- Android APK(加壳+脱壳+加固演练)浅析
- matlab videoToFrames 视频切割成帧
- [转载整理]计算机视觉及机器学习牛人和资料
- 用纯CSS实现优雅的tab页
- 三层锁机病毒的层层逆向剖析
- iphone 存图片和视频到iPhone相册
- 五年北京,这个改变我命运的城市,终于要离开了
- ERROR 1044
- Django 浏览器报错 MIME 类型(“text/html”)不匹配(X-Content-Type-Options: nosniff)
- 如何玩转kvm切换器
- 机器人教父预测AI未来32年!Yann LeCun留言称赞