声明:文中观点仅代表个人,其中文字、图片未经本人许可,不得部分或全部转载,违者所造成影响后后果自负!联系本人方式:80368704@qq.com QQ:80368704
在本章前几节中,我们已经了解了什么是地址,什么是首地址(指针),进而知道了什么是首地址类型(指针类型),下面,我们就把变量或函数的首地址存入到计算机的地址簿中.在计算机C程序中,无论是记录变量的首地址,还是函数的首地址,都需要建立计算机所特有的地址簿。好,让我们来开始建立吧。
一、指针变量
前面的编程知识告诉我们,计算机程序中的数据,我们可以存放在变量中,那么,首地址作为一种重要的数据,同样也可以存放在变量中。你现在应该已经很清楚的一点是:变量需要先定义,再使用!好,我们开始定义存放首地址的变量。存放整型数时,我们定义的是int、short、long、unsigned等类型的变量,存放浮点数,定义float、double等类型;也就是什么类型的数据要存放,我们就定义相应类型的变量。沿着这个思路下去,上一节我们已经知道,首地址是有类型的 ,那么,我们要存放哪种类型的首地址,就必须定义它那种类型的变量。举例如下:
首先:比如,现有int变量 i ;其首地址&i将被存储;我们已经知道,&i 的类型是 int * ;因此,我们需要用类型int *,定义一个变量,不妨起变量名为:p_i,于是有定义语句:int *p_i ;这样定义的p_i,就可以存放首地址&i ,当然是用赋值语句来实现存放,即:p_i=&i ;
其次 :再如,我们已经知道,对于数组float a[3];数组名a就是其首地址,且类型float * ;因此,需先定义一个float *类型的变量:float *p_a;而后,把将a赋给p_a:p_a=a ;
第三:对于函数int main(void){...},其首地址就是main,类型是int (*)(void);因此,需要定义int (*)(void)类型的变量:int (*p_main)(void);而后,把main存入p_main中:p_main=main ;
注:1、不清楚变量的首地址及其类型是如何来的,返回<第2节 首地址与指针>、<第3节 指针类型>!
2、在定义存储首地址的变量时,变量名必须紧跟着*号。
3、存储指针的变量就是“指针变量”。
二、指针数组
当你有1个整数10,你可以定义int i,而后赋值:i=10;i中存放的是int类型的数。如果有5个整数1,2,3,4,5,你可定义数组int j[5];而后赋值j[0]=1;j[1]=2;j[2]=3;j[3]=4;j[4]=5;数组j 中存放的是5个int类型的数。int类型的数,是一种整数,因此数组j是一种整型数组。
当你有1个浮点数1.5,你可以定义float f,而后赋值:f=1.5;变量f中存放的是float类型的数。如果有4个浮点数1.5,2.5,3.5,4.5,你可定义数组float g[4];而后赋值g[0]=1.5;g[1]=2.5;g[2]=3.5;g[3]=4.5;数组g中存放的是4个float类型的数。float类型 的数,是浮点数,因此数组g是一种浮点型数组。
当你有1个字符'a',你可以定义char c,而后赋值:c='a';变量c中存放的是char类型的数。如果有3个字符’a','b','c',你可定义数组char d[3];而后赋值d[0]='a';d[1]='b';d[2]='c';数组d中存放的是3个char类型的数。char类型的数,是字符,因此数组 d是一种字符数组。
当你有1个整型变量m ,首地址&m,你可以定义int *p_m,而后赋值:p_m=&m;p_m 这个变量中存放的是int *类型的数。如果有3个整型变量m,n,o,你就有3个首地址,这时,你可定义数组int *p_n[3];而后赋值p_n[0]=&m;p_n[1]=&n;p_n[2]=&o;p_n这个数组中存放的是3个int *类型的数。int *类型的数,是指针,因此p_n是一种指针数组。
三、指针的指针
张三,其地址是中国北京复兴门外南礼XXX号,通过这个地址我们可以找到他,我们可以用下面语句, 形象的描述地址和张三的关系:地址指向了张三。正因有了这种指向作用 ,地址被称为了指针。当回到C程序中, 你已经知道了,若有变量char i,首地址(或说指针)&i可用char *p_i; 存储,即p_i=&i;因为p_i中的地址&i是指向i 的 ,所以p_i是指向变量i的。
1、指针变量的指针:
p_i的首地址:&p_i;p_i是指针变量,因此&p_i称为指针变量的首地址, 即指针变量的指针。
2、指针变量的指针的类型:
i的类型是:char, 因此&i的类型为char *;
p_i的类型:char *,因此&p_i的类型:char **, 又多了一个星号!
3、存储指针变量的指针:
既然&p_i的类型是char **,那么若你用char ** 定义一个变量:char **p_p_i; 就可用语句p_p_i=&p_i,把&p_i存入p_p_i中.
4、总结上面如下:
&i &p_i
i---------------------->p_i------------------------------------->p_p_i.
p_i存放了i的首地址&i,p_p_i又存放了p_i的首地址&p_i;
5、由于存放了&p_i,指针变量p_p_i指向了另一个指针变量p_i。
&i &p_i
i<---------------------------p_i<--------------------------------p_p_i.
p_p_i指向p_i,p_i又指向i;
象p_p_i这种指向指针变量的指针变量,简称为指针的指针
6、存储指针变量的首地址, 常见在字符串处理中, 后面我们会看到。
这就是用指针变量存储指针的全部!对,一切的一切就是这么简单,哈,胜利向我们招手,曙光就在前头!