CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

关于指针问题,高手进来!在线等待!!

楼主SunGrazer(神怒天炽火)2003-11-02 01:13:35 在 Delphi / VCL组件开发及应用 提问

象在C++中,  
  char   *name;  
  string   filename;  
  filename=slakflwfl;  
  name=filename;  
  for(int   i=0;i<4;i++)  
  pring(name[i]);  
   
  我主要想问的是在C++中指针可以被赋值后,可以当数组来用,在delphi中要怎样才可以?? 问题点数:20、回复次数:8Top

1 楼SunGrazer(神怒天炽火)回复于 2003-11-02 02:04:46 得分 0

怎么大家都不用指针的吗??都没人回答?Top

2 楼CDSoftwareWj(95927)回复于 2003-11-02 02:10:21 得分 0

太简单了    
   
  hehe^^  
   
  var  
      tempStr:   String;  
      tempS:   Char;  
      i:   Integer;  
  begin  
      tempStr   :=   '12345';  
      for   i   :=   0   to   4   do  
      begin  
          tempS   :=   tempStr[i];  
          ShowMessage(tempS);  
      end;  
  end;  
   
  哈哈   在   Delphi   中String类型本身就是Char型数组Top

3 楼SunGrazer(神怒天炽火)回复于 2003-11-02 02:15:00 得分 0

错了,我想你理解错了,我是想把temp声明为一个char指针,让它指向tempstr,并通过对temp这个指针操作来间接对tempstr操作,说得不太明白Top

4 楼CDSoftwareWj(95927)回复于 2003-11-02 02:20:29 得分 0

为什么非要用指针进行间接操作呢??   hehe^^  
   
  玩C++的吧  
   
  Delphi   中的   char   型指针这样定义   ptr   :   ^char;  
  Top

5 楼CDSoftwareWj(95927)回复于 2003-11-02 02:20:58 得分 20

浅谈Object   Pascal的指针  
   
   
    Nicrosoft(nicrosoft@sunistudio.com)   ——   2001.8.26  
          http://www.sunistudio.com/nicrosoft/  
    东日文档:http://www.sunistudio.com/asp/sunidoc.asp  
   
   
   
    大家都认为,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中如何实现:  
      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()的参数同样)。    
   
    七、字符数组的运算。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   也就是   ^Char  
      begin  
        StrCopy(@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;  
      var   fn   :   PVFN;    
        //也可以直接在此处定义,如:fn   :   function   (para:Integer):Integer;  
        hm   :   HMODULE;  
      begin  
        hm   :=   LoadLibrary('test.dll');  
        fn   :=   GetProcAddress(hm,   'Function1');  
        fn(2);  
        FreeLibrary(hm);  
      end;    
  Top

6 楼CDSoftwareWj(95927)回复于 2003-11-02 02:21:10 得分 0

自己看吧Top

7 楼SunGrazer(神怒天炽火)回复于 2003-11-02 02:23:43 得分 0

谢谢!大有收获!Top

8 楼CDSoftwareWj(95927)回复于 2003-11-02 03:09:03 得分 0

还不结帖   hehe^^Top

相关问题

  • 在线等待!鼠标指针问题!
  • 关于返回指针。。。。。(在线等待。。。
  • 关于返回指针。。。。。(在线等待。。。
  • 指针数组(在线等待)?
  • 真诚请教指针问题,再次感谢,在线等待
  • 在线等待,请教一个关于this指针的问题。。。。。。。
  • 关于指针的小问题。。在线等待。。
  • 关于一个指针的问题。 *** *** *** 在线等待
  • 函数指针真难懂!(在线等待)
  • 关于指针的非常简单的问题.(在线等待)

关键词

  • filename

得分解答快速导航

  • 帖主:SunGrazer
  • CDSoftwareWj

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo