指向指针的指针,顾名思义,就是定义一个指针变量,它的值是一个地址,指向的是另一个指针变量的地址。
要理解这个内容,首先需要掌握指针数组的概念。int *pt[4]就是一个指针数组,因为[]的优先级比*高,所以,pt是个数组,其数组元素的值是指向int型变量指针的地址,如:
int a[4]={1,2,3,4}
int *pt[4]={&a[0],&a[1],&a[2],&a[3]}
printf("%d",pt[0]) &a[0],即a[0]的地址
printf("%d",*pt[0]) a[0]的值:1
这时,如果希望获取&pt[0]的地址,可以再次定义一个指针**p,可以看作是
*(*p),一个指针变量,所指向的是另外一个指针变量,所以,p的值可这样得到:p=&pt[0]
此时,要从p得到a[0]的值1,便可以通过指针的二次指向获得
*p:一次间接获取-->pt[0]的值,是个地址,&a[0]
把(*p)看作是一个地址,注意不要搞混
*(*p):从这个地址中再次间接指向,取得a[0]的值:1
int a[4]={1,2,3,4}
int *pt[4]={&a[0],&a[1],&a[2],&a[3]}
int **p;
p=&pt[0];
printf("%d",p) 得到指针数组元素 pt[0]的地址 &pt[0]
printf("%d",*p) 得到a[0]的地址,&a[0]
printf("%d",**p) 得到a[0]的值:1
①、指针与一维数组<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
unsigned char array[10];
unsigned char *p
下面2种方法都可以把指针指向数组
p = array;
p = &arrary [0];
引用数组元素的方法
p + i 和array + i都是数组元素array的地址
*(p + i) 和*(array + i)都是数组元素array
*(p + i)和 p 都是数组元素array
p + i是指向数组的下一个元素,实际地址是p+i*d,d是连续访问单元数目(对象所占的字节数)。
定义并赋值一个指针p之后,就可以用 p的方式把一段内存区域当数组来访问。
②、指针与多维数组
Unsigned char t[3][4];
Unsigned char * p;
P = &t[0][0]; //若p = t会产生警告错误
//此时整个t数组被看作一维数组
*(p+4)与t[1][1]、p[4]等同,表示t[1][1]的值
Unsigned char t[3][4];
Unsigned char (*ph)[4];
Ph = t;
//此时整个t数组被看作具有三个 一维数组t_col[4](包含4个char类型元素)元素的一维数组t_row[3]
ph指向t_row数组的第0个元素(一维数组)与t[0][0]的地址值相同,不等同于*(ph)。
ph+2指向t_row数组的第二个元素(一维数组);与t[2][0]的地址值相同,不等同于*(ph+2)。
*(ph+2)指向t_col的第0个元素(char类型)与ph[2],&t[2][0]等同,表示t[2][0]的地址
*(*(ph+2))与t[2][0]等同,表示t[2][0]的值
*(ph+2)+1与&t[2][1]等同,表示t[2][1]的地址
*(*(ph+2)+1)与t[2][1]、(*(ph+2))[1]、ph[2][1]等同,表示t[2][1]的值
因为ph 表示的是一个指针,此指针指向包含4个元素的一维数组。或者说ph是一个指针, 此指针所指对象是包含4个元素的一维数组,此一维数组是作为一个整体被此指针访问,连续访问单元数目是4*1(char型)。整体访问数组的办法是给出这个数组的指针。
这个例子很容易与后面讲到的指针数组相混淆,注意区别。
虽然上面列举了很多访问数组元素的方法,只不过想说明每种指针的不同而已;建议访问数组元素还是用p++,*p这样的方式来访问,不要用*(p+1)来访问。前一种方法指针直接指向要访问的元素,而后一种方法只是把指针当作一个起点,然后起点加上偏移量,访问速度慢,而且也没有体现出使用指针本来的用意。后一种方法与直接用数组名访问数组元素相同
③、指针数组
指针数组是讲一个元素全部是指针的数组。
定义方法同普通数组: 数据类型 * 数组名[数组长度]
例:char * s[2];//定义一个含有2个指针元素的数组,元素指针指向char类型,属一般指针。
前面提到的指向多维数组的指针是这样定义的:数据类型 * 指针名[一维长度]
例:char (* s)[2];//注意这里的s是一个指针,而上例s是一个数组名,二者截然不同,指针可以实现自加运算,而数组名不能。
指针数组的典型应用是通过对字符数组赋初值而实现各维长度不一的多维数组定义。
例:char code season[4] = {“spring”,”summer”,”fall”,”winter”}
3、 指针与函数
①、指针变量作为函数的参数
指针变量作为函数的参数时,形势参数指针和实际参数指针二者进行的是值传递,直接把实参的值(注意:这个值是一个其它变量地址。)传给形参,传递的结果不会影响到实参的值。例pa实参原指向00H单元,传递后仍然指向00H单元,但函数执行后,00H单元里的内容(*pa)可能会发生变化。
②、返回指针数据的函数
返回指针数据的函数:某函数的返回值是一个指针。
定义方法:数据类型 * 函数名(形参)
例:int * x(char a)
③、函数形指针
函数形指针:一个指向函数入口地址的指针
函数形指针可代替函数名进行函数调用,通常是将一个函数作为参数传递给另一个函数。
定义方法:数据类型 (* 指针名)(形参)
例: int (* pfunc)();//定义一个指向返回值为整形的函数的指针
赋值方法:函数形指针变量名 = 函数名
引用方法:(* 指针名)(实参)或 指针名(实参)
④、函数指针数组
函数指针数组:定义一个数组,数组元素全部为函数形指针
例:code void (code * keyproctab[])() = {k0,k1,k2}
keyproctab :数组名
k0,k1,k2:已定义的函数名
第一个code表示数组的存储空间
void code 表示各数组元素的类型
引用方法:(* keyproctab[2])();//执行函数k2
以上这个例子就是汇编语言中常用的散转,数组下标,表示按键号,对应此下标的函数是键处理程序。
4、 指针与指针
①、指针形指针
指针形指针:指向另一个指针变量的指针,称多级指针。
定义:数据类型 **指针名
数据类型说明一个被指针形指针所指向的指针变量所指向的变量数据类型
例:int **p;
文章评论(0条评论)
登录后参与讨论