指针问题专用贴

来源:互联网 发布:ip攻击软件下载 编辑:程序博客网 时间:2024/05/20 01:44

指针作为形参肯定有很多都不清楚其中具体的原理,我也是最近摸清了些门道:


下面就用一些例子来给大家说明:

[cpp] view plain copy
  1. void myMalloc(char *s) //我想在函数中分配内存,再返回   
  2. {   
  3.     s=(char *) malloc(100);   
  4. }   
  5. void main()   
  6. {   
  7.     char *p=NULL;   
  8.     myMalloc(p); //这里的p实际还是NULL,没有能分配到100字节空间,为什么?   
  9.     if(p)   
  10.        free(p);  
  11. }   

基于上面的问题: 因为指针作为形参传递过去的是它的拷贝,只是说他们指向同一块内存地址。

    上面其实是给他的拷贝体进行了内存地址分配

[cpp] view plain copy
  1. void myMalloc(char **s)   
  2. {   
  3.     *s=(char *) malloc(100);   
  4. }   
  5. void main()   
  6. {   
  7.     char *p=NULL;   
  8.     myMalloc(&p); //这里的p可以得到正确的值了   
  9.     if(p) free(p);   
  10. }   

这里为什么能得到正确的值了呢? 

因为这里形参分配的内存其实是给s本身在分配了 ,上面分配的时候用的是(*s)

[cpp] view plain copy
  1. #include<stdio.h>   
  2. void fun(int *p)   
  3. {   
  4.     int b=100;   
  5.     p=&b;   
  6. }   
  7. main()   
  8. {   
  9.     int a=10;   
  10.     int *q;   
  11.     q=&a;   
  12.     printf("%d/n",*q);   
  13.     fun(q);   
  14.     printf("%d/n",*q);   
  15.     return 0;   
  16. }   
这里打印的结果为: 10  10

为什么呢? 因为main函数中q指针作为形参传递给了fun函数,fun函数中p为q指针的拷贝体,f

fun函数中的p在函数体中重新指向了整数b的地址。所以q指针本身的值是没有发生变化的


[cpp] view plain copy
  1. #include<stdio.h>   
  2. void fun(int *p)   
  3. {   
  4.     *p=100;   
  5. }   
  6. main()   
  7. {   
  8.     int a=10;   
  9.     int *q;   
  10.     q=&a;   
  11.     printf("%d/n",*q);   
  12.     fun(q);   
  13.     printf("%d/n",*q);   
  14.     return 0;   
  15. }   

这里打印的结果是: 10  100

这里可以正确打印我们想要的结果了,因为main函数中的q指针和形参中的p指针都指向了整数a的地址。

fun函数中其实是修改整数a地址中的值,所以在后文中打印指针q中的内容时,也能打印出100了

原创粉丝点击