当前位置: 首页 > news >正文

网站上传图片要求辽宁城乡住房建设厅网站首页

网站上传图片要求,辽宁城乡住房建设厅网站首页,怎样在潇湘书院网站做兼职,国企央企都玩劳务外包函数参数的传递问题#xff08;一级指针和二级指针#xff09; [转]原以为自己对指针掌握了#xff0c;却还是对这个问题不太明白。请教#xff01; 程序1#xff1a; void myMalloc(char *s) //我想在函数中分配内存,再返回 { s(char *) malloc(100); } void … 函数参数的传递问题一级指针和二级指针 [转] 原以为自己对指针掌握了却还是对这个问题不太明白。请教   程序1   void  myMalloc(char  *s)  //我想在函数中分配内存,再返回   {        s(char  *)  malloc(100);   }     void  main()   {        char  *pNULL;        myMalloc(p);    //这里的p实际还是NULL,p的值没有改变为什么        if(p)  free(p);   }   程序2void  myMalloc(char  **s)   {        *s(char  *)  malloc(100);   }     void  main()   {        char  *pNULL;        myMalloc(p);    //这里的p可以得到正确的值了        if(p)  free(p);   }   程序3   #includestdio.h     void  fun(int  *p)   {          int  b100;          pb;   }     main()   {          int  a10;          int  *q;          qa;          printf(%d/n,*q);          fun(q);          printf(%d/n,*q);          return  0;   }   结果为   10   10   程序4   #includestdio.h     void  fun(int  *p)   {          *p100;   }     main()   {          int  a10;          int  *q;          qa;          printf(%d/n,*q);          fun(q);          printf(%d/n,*q);          return  0;   }   结果为   10   100   为什么           ---------------------------------------------------------------     1.被分配内存的是行参sp没有分配内存   2.被分配内存的是行参s指向的指针p所以分配了内存   ---------------------------------------------------------------     不是指针没明白是函数调用的问题看看这段     7.4指针参数是如何传递内存的              如果函数的参数是一个指针不要指望用该指针去申请动态内存。示例7-4-1中Test函数的语句GetMemory(str,  200)并没有使str获得期望的内存str依旧是NULL为什么     void  GetMemory(char  *p,  int  num)   {              p    (char  *)malloc(sizeof(char)  *  num);   }   void  Test(void)   {              char  *str    NULL;              GetMemory(str,  100);            //  str  仍然为  NULL                          strcpy(str,  hello;            //  运行错误   }   示例7-4-1  试图用指针参数申请动态内存     毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本指针参数p的副本是  _p编译器使  _p    p。如果函数体内的程序修改了_p的内容就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中_p申请了新的内存只是把_p所指的内存地址改变了但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上每执行一次GetMemory就会泄露一块内存因为没有用free释放内存。   如果非得要用指针参数去申请内存那么应该改用“指向指针的指针”见示例7-4-2。     void  GetMemory2(char  **p,  int  num)   {              *p    (char  *)malloc(sizeof(char)  *  num);   }   void  Test2(void)   {              char  *str    NULL;              GetMemory2(str,  100);            //  注意参数是  str而不是str              strcpy(str,  hello;                          cout  str    endl;              free(str);               }   示例7-4-2用指向指针的指针申请动态内存     由于“指向指针的指针”这个概念不容易理解我们可以用函数返回值来传递动态内存。这种方法更加简单见示例7-4-3。     char  *GetMemory3(int  num)   {              char  *p    (char  *)malloc(sizeof(char)  *  num);              return  p;   }   void  Test3(void)   {              char  *str    NULL;              str    GetMemory3(100);                          strcpy(str,  hello;              cout  str    endl;              free(str);               }   示例7-4-3  用函数返回值来传递动态内存     用函数返回值来传递动态内存这种方法虽然好用但是常常有人把return语句用错了。这里强调不要用return语句返回指向“栈内存”的指针因为该内存在函数结束时自动消亡见示例7-4-4。     char  *GetString(void)   {              char  p[]    hello  world;              return  p;            //  编译器将提出警告   }   void  Test4(void)   {   char  *str    NULL;   str    GetString();            //  str  的内容是垃圾   cout  str    endl;   }   示例7-4-4  return语句返回指向“栈内存”的指针     用调试器逐步跟踪Test4发现执行str    GetString语句后str不再是NULL指针但是str的内容不是“hello  world”而是垃圾。   如果把示例7-4-4改写成示例7-4-5会怎么样     char  *GetString2(void)   {              char  *p    hello  world;              return  p;   }   void  Test5(void)   {              char  *str    NULL;              str    GetString2();              cout  str    endl;   }   示例7-4-5  return语句返回常量字符串     函数Test5运行虽然不会出错但是函数GetString2的设计概念却是错误的。因为GetString2内的“hello  world”是常量字符串位于静态存储区它在程序生命期内恒定不变。无论什么时候调用GetString2它返回的始终是同一个“只读”的内存块。     ---------------------------------------------------------------     看看林锐的《高质量的C/C编程》呀上面讲得很清楚的   ---------------------------------------------------------------     对于1和2   如果传入的是一级指针S的话   那么函数中将使用的是S的拷贝   要改变S的值只能传入指向S的指针即二级指针     ---------------------------------------------------------------     程序1   void  myMalloc(char  *s)  //我想在函数中分配内存,再返回   {        s(char  *)  malloc(100);  //  s是值参  函数返回后就回复传递前的数值无法带回分配的结果   }   这个和调用  void  func  (int  i)  {i1;};  一样退出函数体i指复原的     程序2void  myMalloc(char  **s)   {        *s(char  *)  malloc(100);  //  这个是可以的   }   等价于   void  int  func(int  *  pI)  {*pI1;}  pI指针不变指针指向的数据内容是变化的   值参本身不变但是值参指向的内存的内容发生了变化。     程序3   void  fun(int  *p)   {          int  b100;          pb;                  //  等同于第一个问题  b的地址并没有被返回   }     程序4     void  fun(int  *p)   {          *p100;    //  okay   }           ---------------------------------------------------------------     其实楼主的问题和指针没有多大关系就是行参和值参的问题     函数调用的时候值参传递的是数值是不会返回的   这个数值在函数体内部相当于一个变量是可以改变但是这个改变是无法带出函数体外部的     ---------------------------------------------------------------     程序1   void  myMalloc(char  *s)  //我想在函数中分配内存,再返回   {        s(char  *)  malloc(100);//传过来的是P所指的地址,并不是P的地址,所以改变S不会改变P   }     void  main()   {        char  *pNULL;        myMalloc(p);    //这里的p实际还是NULL,p的值没有改变为什么        if(p)  free(p);   }   程序2void  myMalloc(char  **s)   {        *s(char  *)  malloc(100);//S指向的是P的地址,所以改变了P所指的内存单元.   }     void  main()   {        char  *pNULL;        myMalloc(p);    //这里的p可以得到正确的值了        if(p)  free(p);   }   程序3   #includestdio.h     void  fun(int  *p)   {          int  b100;          pb;   }     main()   {          int  a10;          int  *q;          qa;          printf(%d/n,*q);          fun(q);道理同第一个程序.          printf(%d/n,*q);          return  0;   }   结果为   10   10   程序4   #includestdio.h     void  fun(int  *p)   {          *p100;//参数P和实参P所指的内存单元是相同的.所以改变了参数P的内存单元内容,就改变了实参                        //的内存单元内容   }     main()   {          int  a10;          int  *q;          qa;          printf(%d/n,*q);          fun(q);          printf(%d/n,*q);          return  0;   }   结果为   10   100   为什么   ---------------------------------------------------------------     void  main()   {        char  *pNULL;        myMalloc(p);    //这里的p实际还是NULL,p的值没有改变为什么        if(p)  free(p);   }       void  myMalloc(char  *s)  //我想在函数中分配内存,再返回   {        s(char  *)  malloc(100);   }     myMalloc(p)的执行过程:   分配一个临时变量char  *ss的值等于p也就是NULL但是s占用的是与p不同的内存空间。此后函数的执行与p一点关系都没有了只是用p的值来初始化s。   然后s(char  *)  malloc(100)把s的值赋成malloc的地址对p的值没有任何影响。p的值还是NULL。   注意指针变量只是一个特殊的变量实际上它存的是整数值但是它是内存中的某个地址。通过它可以访问这个地址。     程序2void  myMalloc(char  **s)   {        *s(char  *)  malloc(100);   }     void  main()   {        char  *pNULL;        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)而0x5555这个位置上存的是恰好是指针变量p这样p的值就变成了(char  *)  malloc(100)的值。即p的值是新分配的这块内存的起始地址。     这个问题理解起来有点绕关键是理解变量作函数形参调用的时候都是要分配一个副本不管是传值还是传址。传入后就和形参没有关系了它不会改变形参的值。myMalloc(p)不会改变p的值p的值当然是NULL它只能改变p所指向的内存地址的值。但是myMalloc(p)为什么就可以了它不会改变(p)的值也不可能改变但是它可以改变(p)所指向内存地址的值即p的值。     ---------------------------------------------------------------     你要弄清楚的是指针变量和指针所指的变量可能是一片内存。     指针变量和普通变量一样存储的     如int  *p;  int  i;  p和i都是变量都占用一个字的内存都可
http://www.zqtcl.cn/news/406892/

相关文章:

  • 象山经济开发区建设有限公司网站足球比赛直播app
  • 国外做mg动画的网站大全网站打不开 别的电脑能打开
  • 手机怎么创网站西宁企业做网站
  • 网站主机多大wordpress连接错误
  • 3d建站电商平台网站开发过程是什么
  • 优化核心系列网站wordpress下拉刷新
  • 深圳建站定制公司国外试用网站空间
  • 网站建设的原则有哪些内容建设网站的详细步骤
  • wordpress网站换字体宣传电脑的网站开发
  • 移动网站设计上机考试修改wordpress域名
  • 个体户 建设网站房子已交房 建设局网站查不到
  • 在自己的电脑建设空间网站百中搜优化软件
  • 专业房产网站建设公司wordpress导入项目
  • 网站安全建设必要性企业vi设计是什么意思
  • 建站工具有哪些社区兰州市城乡建设局网站通知公告
  • 深圳市移动端网站建设wordpress get_category_parents
  • 多用户商城(c2c)网站制作方案招聘网站如何做推广
  • 微信云网站用什么做做网站卖产品
  • 最专业的企业营销型网站建设简述无线网络优化的流程
  • 茶叶响应式网站做网站还有钱赚吗
  • 枣庄建设路小学网站资源下载wordpress
  • 青海建设厅网站首页建设一个网站论坛要多少钱
  • 网站稳定性深圳网站建设有限公司 2019
  • 西城专业网站建设公司哪家好优秀的网站建设解决方案
  • 做网站接广告手机百度引擎搜索入口
  • html5网站怎么建设后台怎么弄厦门微信网站建
  • 幻影图片一键制作网站建筑工程是干嘛的
  • 技术支持 东莞网站建设东莞天助免费网站申请域名39939cn
  • js打开网站wordpress线报主题
  • 怎么做网站首页弹幕外贸网站高端定做