指针做函数参数

转载 2016年08月30日 10:19:13

程序1:

void  main()  

{  
     char  *p=NULL;  
     myMalloc(p);    //这里的p实际还是NULL,p的值没有改变,为什么?  
     if(p)  free(p);  

void  myMalloc(char  *s)  //我想在函数中分配内存,再返回  
{  
     s=(char  *)  malloc(100);  
}  
 
myMalloc(p)的执行过程:  
分配一个临时变量char  *s,s的值等于p,也就是NULL,但是s占用的是与p不同的内存空间。此后函数的执行与p一点关系都没有了!只是用p的值来初始化s。  
然后s=(char  *)  malloc(100),把s的值赋成malloc的地址,对p的值没有任何影响。p的值还是NULL。  
注意指针变量只是一个特殊的变量,实际上它存的是整数值,但是它是内存中的某个地址。通过它可以访问这个地址。  
 

程序2:

void  myMalloc(char  **s)  

{  
     *s=(char  *)  malloc(100);  
}  
void  main()  
{  
     char  *p=NULL;  
     myMalloc(&p);    //这里的p可以得到正确的值了  
     if(p)  free(p);  
}  
程序2是正确的,为什么呢?看一个执行过程就知道了:  
myMalloc(&p);将p的地址传入函数,假设存储p变量的地址是0x5555,则0x5555这个地址存的是指针变量p的值,也就是Ox5555指向p。  
调用的时候同样分配一个临时变量char **s,此时s  的值是&p的值也就是0x5555,但是s所占的空间是另外的空间,只不过它所指向的值是一个地址:Ox5555。  
*s=(char *)malloc(100);这一句话的意思是将s所指向的值,也就是0x5555这个位置上的变量的值赋为(char *)malloc(100)(并不是改变p的地址值0x5555,而是指针变量p本身的值),而0x5555这个位置上存的是恰好是指针变量p,这样p的值就变成了(char *)malloc(100)的值。即p的值是新分配的这块内存的起始地址。  
 

这个问题理解起来有点绕,关键是理解变量作函数形参调用的时候都是要分配一个副本,不管是传值还是传址。传入后就和形参没有关系了,它不会改变形参的值。myMalloc(p)不会改变p的值,p的值当然是 NULL,它只能改变p所指向的内存地址的值。但是myMalloc(&p)为什么就可以了,它不会改变(&p)的值也不可能改变,但是它可以改变(&p)所指向内存地址的值,即p的值。  


程序3:  
#include  
 
void  fun(int  *p)  
{  
       int  b=100;  
       p=&b;  
}  
 
main()  
{  
       int  a=10;  
       int  *q;  
       q=&a;  
       printf("%d\n",*q);  
       fun(q);////道理同第一个程序  
       printf("%d\n",*q);  
       return  0;  
}  
结果为  
10  
10  

程序4:  

void  fun(int  *p)  
{  
       *p=100;//参数p和实参q所指的内存单元是相同的.所以改变了参数P的内存单元内容,就改变了实参  
                     //的内存单元内容  
}  
main()  
{  
       int  a=10;  
       int  *q;  
       q=&a;  
       printf("%d\n",*q);  
       fun(q);  
       printf("%d\n",*q);  
       return  0;  
}  
结果为  
10  
100  

指针作为函数参数在C/C++中调试和探讨

通过一道码农常遇到的问题但是并未去深入分析过的问题,一步一步的调试跟踪截图来分析,问题出在哪里,怎么解决和理解,来帮助消化知识点:函数传值和传指针的相同。函数传递时仅仅是传递的值。借用一位网友的总结:...
  • liquanhai
  • liquanhai
  • 2014年01月27日 17:10
  • 3300

C语言中“指针”作为“函数参数”时的注意事项

C语言中“指针”作为“函数参数”时的注意事项
  • dan15188387481
  • dan15188387481
  • 2015年10月23日 16:58
  • 5364

指针作为函数的形参的总结

本文是在编程过程中遇到的实际问题,作为总结。参考文档:http://blog.csdn.net/gexueyuan/article/details/9077679        一般用指针做函数形参...
  • u012892086
  • u012892086
  • 2013年12月05日 23:22
  • 2136

数组作与指针做参数比较

数组作与指针做参数比较C语言中的数组可分为一维数组和多维数组两类,而多维数组中又以二维数组最为常见。这里也仅针对这一维数组和二维数组作简要说明。高质量C++编程指南中指出当数组作为函数的参数进行传递时...
  • liyanguestc
  • liyanguestc
  • 2007年05月13日 21:10
  • 2861

指针和双指针作为函数参数

1. 每个变量都有一个地址和初值,初值可以被改变,这个值的类型可以是int,char,double,float等。 2. 指针是变量,指针变量也有地址和初值,只不过指针变量的值是地址类型。 3. ...
  • ddl2111
  • ddl2111
  • 2016年02月25日 20:25
  • 350

C语言中指针变量作为函数参数和一般变量作为函数参数的区别

函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。指针变量作为函数参数和一般变量作为函数参数是有区别的,对于这种区别初学者一般都很迷惑。下...
  • fullbug
  • fullbug
  • 2007年04月09日 13:09
  • 10335

函数的指针参数传出时遇到的问题

一般而言,函数传出值是没有什么问题的, 一般是这样 要将值传出来,用指针; 要将指针传出来,用二级指针; 最明显的错误是下面的void test(char a,char b) { b=...
  • u010442328
  • u010442328
  • 2015年07月10日 14:59
  • 516

用指向数组的指针作函数参数.etc

今天还是以课本上的例子为主。 有一个班,3个学生各学四门课,计算总平均分及第n个学生的成绩。 先定义一个计算平均值得函数,average。 void average(float *p,int n) {...
  • sherilindas
  • sherilindas
  • 2016年04月01日 00:12
  • 478

指针重难、易错点

(一)函数指针 在前边的blog中,已经整理归纳了数组和初级指针,接下来,我来继续整理高级指针和如何正确使用指针。 我们说过,指针数组是一个数组,每个元素是指针;数组指针是个指针,指向的是数组。所以:...
  • peiyao456
  • peiyao456
  • 2016年05月07日 09:58
  • 1264

C语言指针笔记之 一级指针的应用(指针做函数参数)

前面说过,间接赋值是指针存在的重要意义,也举了个简单的例子实现了指针的间接赋值,然而那只是间接赋值的一个小知识点,它是在一个函数中实现的,间接赋值的精华则是:指针通过做函数参数来实现间接赋值的目的。 ...
  • wuxiong19930518
  • wuxiong19930518
  • 2015年06月18日 12:09
  • 476
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指针做函数参数
举报原因:
原因补充:

(最多只允许输入30个字)