1、
short int i;
char a;
short int * pi;
i=50;
pi=&i;
----------------指针的指针,浓重出厂
short int * * ppi; //这是一个指向指针的指针,注意有两个*号
ppi=π
------
结果:
ppi是pi的地址值
*ppi 是 pi地址值里面的内容,也就是 i的地址值。 *ppi(等价于pi,前面有声明ppi=π 前面加个*号,双重否定)
**ppi 就是i的内容。(因为*ppi=pi,所以**ppi=*pi=i)
2、例二:
#include "stdio.h" void find1(char array[], char search, char * pa) { int i; for (i=0;*(array+i)!=0;i++) { if (*(array+i)==search) { pa=array+i; break; } else if (*(array+i)==0) { pa=0; break; } } } int main() { char str[]={"afsdfsdfdf "}; //待查找的字符串 char a='d'; //设置要查找的字符 char *p=0; //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。 find1(str,a,p); //调用函数以实现所要操作。 if (0==p ) { printf("没找到"); } else { printf("找到了,p=%d",p); } }
上面代码,你认为会是输出什么呢?
运行试试。
唉!怎么输出的是:没有找到!
而不是:找到了,……。
明明a值为’d’,而str字符串的第四个字符是’d’,应该找得到呀!
再看函数定义处:void find1(char [] array, char search, char * pa)
看调用处:find1(str,a,p);
依我在第五篇的分析方法,函数调用时会对每一个参数进行一个隐含的赋值操作。
整个调用如下:
array=str;
search=a;
pa=p; //请注意:以上三句是调用时隐含的动作。//个人总结, 看函数的接口部分:Exchg2(int *px,int *py),请注意:参数px,py都是指针。
// 再看调用处:Exchg2(&a, &b) int i; 等价于px=&a;py=&b;
//它将a的地址(&a)代入到px,b的地址(&b)代入到py。同上面的值传递一样,函数调用时作了两个隐含的操作:将&a,&b的值赋值给了px,py。
for (i=0;*(array+i)!=0;i++)
{
if (*(array+i)==search)
{
pa=array+i
break;
}
else if (*(array+i)==0)
{
pa=0;
break;
}
}
哦!参数pa与参数search的传递并没有什么不同,都是值传递嘛(小语:地址传递其实就是地址值传递嘛)!所以对形参变量pa值(当然值是一个地址值)的修改并不会改变实参变量p值,因此p的值并没有改变(即p的指向并没有被改变)。
(如果还有疑问,再看一看《第五篇:函数参数的传递》了。)
修正版:
#include "stdio.h" void find1(char array[], char search, char **pa) { int i; for (i=0;*(array+i)!=0;i++) { if (*(array+i)==search) { *pa=array+i; break; } else if (*(array+i)==0) { *pa=0; break; } } } int main() { char str[]={"afsdfsdfdf "}; //待查找的字符串 char a='d'; //设置要查找的字符 char *p=0; //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。 find1(str,a,&p); //调用函数以实现所要操作。 if (0==p ) { printf("没找到"); } else { printf("找到了,p=%d",*p); } }
完整分析版:
#include "stdio.h" void find1(char array[], char search, char *pa) { int i; // // 注意,不是 *pa=&p; 而是 pa=&p,*pa=p,**pa=*p
// 如果上面参数是*pa,那么pa=p,只是p的一个副本而已 pa是p的内容,所以*pa指向以内容为地址的地方,内容不知道是多少 for (i=0;*(array+i)!=0;i++) { if (*(array+i)==search) { *pa=array+i; break; } else if (*(array+i)==0) { *pa=0; break; } } } int main() { char str[]={"afsdfsdfdf "}; //待查找的字符串 char a='d'; //设置要查找的字符 char *p=0; //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。 find1(str,a,&p); //调用函数以实现所要操作。 if (0==p ) { printf("没找到"); } else { printf("找到了,p=%d",*p); } }