小议指向指针的指针
来源:互联网 发布:虚拟假充值软件 编辑:程序博客网 时间:2024/06/10 08:50
指针变量本身与其它变量一样也是在某个内存地址中的,我们也可能让某个指针指向这个地址。
下面提供2个来自于网络的案例分析。
案例一:
void GetMemory(char *p,int num){ p=(char*)malloc(sizeof(char)*num); //p是形参指向的地址。}void main(){ char *str=NULL; GetMemory(str,100); //str是实参指向的地址,不能通过调用函数来申请内存 strcpy(str,"hello");}
{
*p=(char*)malloc(sizeof(char)*num); //此时*p就变成了是形参本身的地址
}
void main()
{
char *str=NULL;
GetMemory(&str,100); //&str是实参的地址,所以实参和形参之间就可以直接调用
strcpy(str,"hello");
free(str);
案例二:
设计一个函数:void find1(char array[], char search, char * pa)
要求:这个函数参数中的数组array是以0值为结束的字符串,要求在字符串array中查找字符是参数search里的字符。如果找到,函数通过第三个参数(pa)返回值为array字符串中第一个找到的字符的地址。如果没找到,则为pa为0。
解答:依题意,实现代码如下。
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; } } }
我下面调用这个函数作测试:
void main() { char str[]={“afsdfsdfdf\0”}; //待查找的字符串 char a=’d’; //设置要查找的字符 char * p=0; //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。 find1(str,a,p); //调用函数以实现所要操作。 if (0==p ) { printf (“没找到!\n”);//1.如果没找到则输出此句 } 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; //请注意:以上三句是调用时隐含的动作。 int i; for (i=0;*(array+i)!=0;i++) { if (*(array+i)==search) { pa=array+i //此处改变的是指针本身,在函数find1()运行结束返回后,并不会保存这种改变;如果改变的是指针所指 的对象(*P),则函数find1()运行结束后会返回这种改变,注意两者的不同。 break; } else if (*(array+i)==0) { pa=0; break; } } 哦!参数pa与参数search的传递并没有什么不同,都是值传递嘛(小语:地址传递其实就是地址值传递嘛)!所以对形参变量pa值(当然值是一个地址值)的修改并不会改变实参变量p值,因此p的值并没有改变(即p的指向并没有被改变)。 (如果还有疑问,再看一看《第五篇:函数参数的传递》了。) 修正: void find2(char [] array, char search, char ** ppa) { int i; for (i=0;*(array+i)!=0;i++) { if (*(array+i)==search) { *ppa=array+i break; } else if (*(array+i)==0) { *ppa=0; break; } } } 主函数的调用处改如下: find2(str,a,&p); //调用函数以实现所要操作。 再分析: 这样调用函数时的整个操作变成如下: array=str; search=a; ppa=&p; //请注意:以上三句是调用时隐含的动作。 int i; for (i=0;*(array+i)!=0;i++) { if (*(array+i)==search) { *ppa=array+i break; } else if (*(array+i)==0) { *ppa=0; break; } }
看明白了吗?
ppa指向指针p的地址。
对*ppa的修改就是对p值的修改。
你自行去调试。
经过修改后的程序就可以完成所要的功能了。
总结,在指针做参数传递给函数的时候:只能保留指针指向的对象(*P)改变的值。不能保留指针本身(P)所做得修改。在需要修改指针本身的时候,需使用指向指针的指针作为参数,也便是传值与传址的差别所在。
总结,在指针做参数传递给函数的时候:只能保留指针指向的对象(*P)改变的值。不能保留指针本身(P)所做得修改。在需要修改指针本身的时候,需使用指向指针的指针作为参数,也便是传值与传址的差别所在。
- 小议指向指针的指针
- 小议如何改变指针的指向
- 小议如何改变指针的指向
- 小议如何改变指针的指向
- 指向指针的指针
- 指向指针的指针
- 指向指针的指针
- 指向指针的指针 **
- 指向指针的指针
- 指向指针的指针
- 指向指针的指针
- 指向指针的指针
- 指向指针的指针
- 指向指针的指针
- 指向指针的指针
- 指向指针的指针
- 指向指针的指针
- 指向指针的指针
- 数理逻辑:证明论初步(0)目录
- JavaBean开发规范
- POJ2082 最大矩形面积
- PHP服务器端手机号码验证
- fusionchart jsp入门步骤
- 小议指向指针的指针
- 使用LoadRunner监控Apache
- 银行
- ssh正向连接、反向连接、做socks代理
- POI操作EXCEL出现的单元格格式丢失问题的解决方案
- WTL8.0 调用 ActiveX 控件 - (调用 Flash 控件,响应 Flash 控件的事件)
- Oracle 11g 新特性 -- SecureFiles 说明
- 正确的二分查找算法
- spring MVC之用Handler Interceptor拦截请求