指针的指针有什么用

[复制链接]
查看11 | 回复7 | 2007-8-18 15:28:15 | 显示全部楼层 |阅读模式
其实就是二重指针,一个指针变量里放了另一个指针变量的地址一个简单的实例就是指针数组,数组的实质就是指针,指针数组的某个元素是一个指针变量,总共就是2重指针比如说char *str[ 5 ],它存放5个字符串,如果对某个字符串的引用就是指向这个字符串首地址即指针的指针汗~~我表达能力不行,不好意思
回复

使用道具 举报

千问 | 2007-8-18 15:28:15 | 显示全部楼层
到目前位置我还没有用到过二级指针能想到的就是指针数组的索引如果你所说的比如 int p[3]; int* x=&p ==> int** x = &p;这样如果 int类型改为指针类型则char* p[3];char** x = &p;x作为p的索引
回复

使用道具 举报

千问 | 2007-8-18 15:28:15 | 显示全部楼层
我知道一个作用:指针的指针可以用来在函数中改变作为参数的指针的值。比如说:void func(char **ptr){*ptr = NULL;}int main() {char a = 'a';char *ptr = &a;func(&ptr);}这样就把ptr的值更改了。但如果单纯地void func(char *ptr)只能改变指针指向的内容。
回复

使用道具 举报

千问 | 2007-8-18 15:28:15 | 显示全部楼层
原指针是指向地址,指针的指针是反向地址,指向原来所代替的实数.指针的用处我知道 比如 int p[3]; int* x=&p x作为p的索引 ---------------------------------问题就在于,你对指针的理解过于肤浅了,所以你无法理解指向指针的指针的涵义。指针不是什么索引不索引的问题,指针就是用来存放内存地址的,指针的指针就是用来存放指针所在的内存地址的,螳螂捕蝉,黄雀在后也。
回复

使用道具 举报

千问 | 2007-8-18 15:28:15 | 显示全部楼层
就是指向指针的地址的,xemoaya 的例子就不错,传参的时候有写地方要用二级指针才能改变变量的值。
回复

使用道具 举报

千问 | 2007-8-18 15:28:15 | 显示全部楼层
指针的指针最常用的就是字符串数组。
回复

使用道具 举报

千问 | 2007-8-18 15:28:15 | 显示全部楼层
int main(int argc, char **argv);
回复

使用道具 举报

千问 | 2007-8-18 15:28:15 | 显示全部楼层
2.在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)。指针一般出现在比较近机器语言的语言,如汇编语言或C语言。面向对象的语言如Java一般避免用指针。指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的变量或函树的值。大家都认为,c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。同时,这种说法也让很多人产生误解,似乎只有c语言的指针才能算指针。basic不支持指针,在此不论。其实,pascal语言本身也是支持指针的。从最初的pascal发展至今的object pascal,可以说在指针运用上,丝毫不会逊色于c语言的指针。以下内容分为八部分,分别是一、类型指针的定义二、无类型指针的定义三、指针的解除引用四、取地址(指针赋值)五、指针运算六、动态内存分配七、字符数组的运算八、函数指针一、类型指针的定义。对于指向特定类型的指针,在c中是这样定义的:int *ptr;char *ptr;与之等价的object pascal是如何定义的呢?varptr : ^integer;ptr : ^char;其实也就是符号的差别而已。二、无类型指针的定义。c中有void *类型,也就是可以指向任何类型数据的指针。object pascal为其定义了一个专门的类型:pointer。于是,ptr : pointer;就与c中的void *ptr;等价了。三、指针的解除引用。要解除指针引用(即取出指针所指区域的值),c 的语法是 (*ptr),objectpascal则是 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 可以看作 ^charbeginptr := @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;begingetmem(ptr, sizeof(integer) * 20);//这句等价于c的 ptr = (int*) malloc(sizeof(int) * 20);ptr2 := ptr; //保留原始指针位置for i := 0 to 19 dobeginptr^ := 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 也就是 ^charbeginstrcopy(@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;varfn : pvfn;//也可以直接在此处定义,如:fn : function (para:integer):integer;hm : hmodule;beginhm := loadlibrary('test.dll');fn := getprocaddress(hm, 'function1');fn(2);freelibrary(hm);end;指针 以手指代针称指针。指在一定穴位或部位上用按、压、点、掐等手法治疗疾病的方法。有舒筋活络、疏通瘀滞,开窍止痛等作用。《针灸大成》:“如急惊、天吊惊,掐手上青筋……以上数法乃以手代针之神术也。”后人因称此为指针。 指针是一种数据类型,与其它的数据类型不同的是指针是一种“用来存放地址值的”变量。举一个简单的例子: 如果定义了一个整型变量,根据整型变量的特点,它可以存放的数是整数。 如:int a; a=100; 这样就把整型常量赋给了变量a。但是如果写成这样:a=123.33;就会出问题,最后输出变量a的值结果是123。现在说到指针,其实地址值也是一个整型数,如某某变量的地址值为36542,说明这个变量被分配在内存地址值为36542的地方。能不能这样进行推理,既然地址值也是整型数,整型变量正好可以用来存放整型数,那不是一个整型变量可以用来存放地址的值吗。程序写成下面这样: int a,b; a=&b; 很明显,这样写是错误的。原因在于不能简单地把地址理解为整型数。 应有这样的对应关系: 地址值<--->指针; 整型数<--->int 型变量。 所以有这样的说法:“指针就是地址”(指针就是存放地址值的一种数据类型) 下面是一段正确的程序: int a,*p; p=&a; /*把变量a的地址值赋给指针p*/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行