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

黄岩区住房保障建设局网站idc数据中心排名

黄岩区住房保障建设局网站,idc数据中心排名,建设工程信息在哪个网站,哪个网站的系统当函数参数为一级指针#xff0c;二级指针 在讲述内容之前#xff0c;先讲四点重要知识 1.当传入参数时#xff0c;函数形参会立即申请形参的内存空间#xff0c;函数执行完毕后#xff0c;形参的内存空间立即释放掉。 1.指针是存放其他变量地址的变量。指针有自己的内…当函数参数为一级指针二级指针 在讲述内容之前先讲四点重要知识 1.当传入参数时函数形参会立即申请形参的内存空间函数执行完毕后形参的内存空间立即释放掉。 1.指针是存放其他变量地址的变量。指针有自己的内存空间内存空间存放的是其他变量的地址。 2.指针具体指向谁要看指针内存空间存放的地址。存放谁的地址就指向谁。 3.函数参数传参本质实参传给形参都是拷贝. 指针做函数参数的本质剖析讲述四种情况 一、传变量 #include iostream using namespace std; #include cstring using namespace std; void change(int value) {coutchange:: valueendl;value 20; }int main() {int a 10;coutmain:: aendl;change(a);cout a endl;return 0; }为什么a的值没发生变化请从地址空间的角度分析 在你的代码中函数change接收的是变量a的值而不是它的引用或指针。这意味着在函数change中参数value是变量a的一个副本它们在内存中的地址是不同的。因此当你在函数change中修改value的值时这个改变不会影响到原始变量a。 这就是为什么打印出来的地址是不同的并且变量a的值没有发生改变。如果你想在函数中修改变量a的值你需要使用引用或指针。例如 void change(int value) {coutchange:: valueendl;value 20; }或者 void change(int* value) {coutchange:: valueendl;*value 20; }在C中当我们将一个变量作为参数传递给一个函数时通常有两种方式值传递和引用传递。 值传递当我们通过值传递一个变量时实际上是在内存中创建了这个变量的一个副本。这个副本有自己的内存地址与原始变量的地址不同。因此当我们在函数中修改这个副本的值时原始变量的值并不会改变。引用传递当我们通过引用或指针传递一个变量时我们实际上是将原始变量的内存地址传递给了函数。因此函数中对参数的任何修改都会直接反映到原始变量上因为它们共享同一块内存空间 二、一级指针 传地址 #include iostream using namespace std; #include cstring using namespace std; void change(int* value) {coutchange:: valueendl;*value 20; }int main() {int a 10;coutmain:: aendl;change(a);cout a endl;return 0; }可见value 和 a的地址是相同的 三、一级指针 判断改变p的值不会影响到函数外部的指针 #include stdio.h #include stdlib.h #includeiostream using namespace std; void change(int *pp) { // int* ppQ;coutpp的值ppendl;coutpp的地址ppendl;pp (int *)malloc(sizeof(int));coutmalloc之后 pp的值ppendl;coutmalloc之后 pp的地址ppendl;}int main() {int Q3;int *p Q;coutQ的地址Qendl;coutp的值pendl;coutp的地址pendl;change(p);coutmalloc之后 p的值pendl;coutmalloc之后 p的地址pendl;coutmalloc之后 Q的值 *pendl;free(p);return 0; }产生中断也就是说上面的程序存在问题有什么问题呢 为什么一级指针改变p的值不会影响到外部的指针 这是因为在C语言中函数参数是通过值传递的。当你将一个一级指针作为参数传递给一个函数时实际上传递的是这个指针的值是它保存的内存地址也就是它所指向的内存地址,的一个副本。也就是说str 的值等于 p的值但str 本身的地址 和 p 本身的地址是不同的。 比如 因为 str 和 p 的地址是不同的所以他们是不同的指针。 在函数内部你可以修改这个副本把新分配的内存地址空间赋值给p,p的值也就是p指向的内存空间变了但是这个修改不会影响到原来的指针。 举个例子假设你有一个指针p它的值也就是它所指向的内存地址是0x1000。当你将p作为参数传递给一个函数时这个函数会收到一个值为0x1000的新指针。如果你在函数内部改变这个新指针的值例如将它设置为NULL那么这个改变只会影响到这个新指针而不会影响到原来的p 因此当你在函数内部改变一级指针的值时这个改变不会影响到外部的指针。 执行malloc 函数 之后 为什么指向同一个内存地址的两个一级指针在函数内部改变这个新的一级指针的值时这个改变不会影响到原来的p。 这是因为在C语言中函数参数是通过值传递的。这意味着当你将一个指针无论是一级指针还是二级指针作为参数传递给一个函数时实际上传递的是这个指针的值也就是它所指向的内存地址的一个副本。 当你传递一个一级指针p给一个函数时函数会收到一个新的一级指针这个新的一级指针和p有相同的值也就是它们都指向同一个内存地址。但是这个新的一级指针和p并不是同一个指针他们本身的地址不同它们只是有相同的值而已。因此当你在函数内部改变这个新的一级指针的值时这个改变不会影响到原来的p。 换句话说当你在函数内部改变一级指针的值时你实际上是改变了这个一级指针副本的值而不是原来的一级指针p。因为副本和原来的一级指针p是两个不同的变量它们只是恰好有相同的值也就是它们都指向同一个内存地址。所以改变副本的值并不会影响到原来的一级指针p。 四、二级指针 判断改变p的值不会影响到函数外部的指针 #include stdio.h #include stdlib.hvoid change(int **pp) {*pp (int *)malloc(sizeof(int));**pp 100; }int main() {int *p NULL;change(p);printf(%d\n, *p); // 输出100free(p);return 0; }在你的代码中change函数的参数是一个二级指针pp。当你调用change(p)时你实际上是将指针p的地址传递给了函数。这个地址就是二级指针pp所指向的地址。 因此pp和p实际上是同一个地址。当你在函数中通过解引用操作符*来访问并修改pp时你实际上是在修改原始指针p的值。这就是为什么这段代码能够成功运行并正确地修改p的值。 为什么指向同一个一级指针的二级指针当我在函数内部改变这个新的二级指针所指向的一级指针时这个改变会影响到原来的一级指针。 这是因为当你传递一个二级指针到一个函数时你实际上是传递了一个指向一级指针的指针的副本。这个副本指向的是原始一级指针的内存地址。因此当你在函数内部改变这个二级指针所指向的一级指针时你实际上是改变了原始一级指针的值。 举个例子假设你有一个一级指针p它的值也就是它所指向的内存地址是0x1000。然后你有一个二级指针pp它的值也就是它所指向的内存地址是p的地址。当你将pp作为参数传递给一个函数时这个函数会收到一个新的二级指针这个新的二级指针和pp有相同的值也就是它们都指向同一个一级指针。但是这个新的二级指针和pp并不是同一个二级指针它们只是有相同的值而已。然而由于这个新的二级指针和pp都指向同一个一级指针所以当你在函数内部改变这个新的二级指针所指向的一级指针例如将它设置为NULL那么这个改变会影响到原来的一级指针。 因此当你在函数内部改变二级指针所指向的一级指针时这个改变会影响到外部的一级指针。 这个为什么拷贝成功了呢 在讲述之前先注意p是二级指针*p是一级指针GetMemory(str)传参时指针变量p申请内存空间这时有两个内存空间str的地址拷贝给p的内存空间即p的内存空间的内容是str的地址这时p指向str的内存空间—p str*p strp 和 str两个名字其实是相等的指向的是同一块内存空间(上述程序在此时是NULL)。 p (char )malloc(sizeof(100)),在堆上面申请一个100的内存空间返回这个内存空间的首地址赋值给p;*p是一级指针p(str)内存空间就有值了不再是NULL内存空间的内容是这个地址也就是p和str指向这块内存空间这个内存空间可以存放100个变量的地址所以指针是存放其他变量地址的变量还是对的。接下来的strcpy(str, “hello world”)也就成功了free(str)释放掉str(*p)所指向的内存空间.请注意在这个过程中p的内存空间的地址始终是str的地址没有改变。 以上内容纯粹个人理解如有不对之处欢迎批评指正。 总结 二级指针和一级指针作为函数参数的区别 二级指针和一级指针作为函数参数传递时的区别 一级指针和二级指针在作为函数参数传递时的主要区别在于它们可以修改的内容。 当你传递一个一级指针到一个函数时你可以通过这个指针修改它所指向的值但是你不能改变这个指针本身所指向的内存地址。例如 void func(int *p) {*p 5; // 可以修改p所指向的值p NULL; // 这里改变p的值不会影响到函数外部的指针 }而当你传递一个二级指针到一个函数时你既可以修改这个指针所指向的值也可以改变这个指针本身所指向的内存地址。例如 void func(int **p) {**p 5; // 可以修改p所指向的值*p NULL; // 这里改变*p的值会影响到函数外部的指针 }因此如果你想在一个函数中动态地改变一个指针所指向的内存地址你需要传递一个二级指针。如果你只是想通过一个函数来改变一个值那么传递一级指针就足够了。 在C中一级指针和二级指针作为函数参数有着不同的用途。 一级指针当我们将一个一级指针作为函数参数时我们可以在函数内部修改该指针所指向的值但不能改变该指针本身。例如 void changeValue(int *p) {*p 100; // 修改p所指向的值 }int main() {int a 10;int *p a;changeValue(p);cout a endl; // 输出100return 0; }在上述代码中我们将一级指针p作为参数传递给了changeValue函数并在函数内部修改了p所指向的值。因此当我们回到主函数并打印出a的值时输出的结果是100。 二级指针当我们将一个二级指针作为函数参数时我们可以在函数内部修改该二级指针所指向的一级指针本身。例如 void changePointer(int **pp) {*pp (int *)malloc(sizeof(int));**pp 100; // 修改pp所指向的一级指针所指向的值 }int main() {int *p NULL;changePointer(p);cout *p endl; // 输出100free(p);return 0; }在上述代码中我们将一级指针p的地址也就是一个二级指针作为参数传递给了changePointer函数并在函数内部修改了该二级指针所指向的一级指针本身。因此当我们回到主函数并打印出*p的值时输出的结果是100。 #include stdio.h #include stdlib.h #includeiostream using namespace std; void change(int **npp) {coutnpp的值nppendl;coutnpp的地址nppendl;*npp (int *)malloc(sizeof(int));**npp 100;coutmalloc之后 npp的值nppendl;coutmalloc之后 npp的地址nppendl; }int main() {int Q3;int *p Q;int **ppp;coutQ的地址Qendl;coutp的值pendl;coutp的地址pendl;coutpp的值ppendl;coutpp的地址ppendl;change(p);coutmalloc之后 p的值pendl;coutmalloc之后 p的地址pendl;coutmalloc之后 pp的值ppendl;coutmalloc之后 pp的地址ppendl;coutmalloc之后 Q的值 *pendl;free(p);return 0; }为什么这段代码中 pp 和npp 操作的是同一块内存空间 当然可以。让我们用一个比喻来理解一下 假设你有 一个房子变量这个房子有一个地址指针。你把这个地址写在一张纸上一级指针作为函数参数然后给了你的朋友函数。你的朋友可以通过这个地址找到你的房子并且可以改变房子里面的东西修改指针所指向的值但是他不能改变房子的位置不能改变指针本身。 现在假设你不仅把房子的地址写在纸上而且还把这张纸的地址二级指针也写在另一张纸上然后给了你的朋友。这次你的朋友不仅可以改变房子里面的东西还可以改变第一张纸上写的地址可以改变一级指针本身。这就好比他可以把第一张纸上的地址擦掉然后写上一个新的地址。这样当你看第一张纸时你会发现房子的位置已经改变了。 希望这个比喻能帮助你理解一级指针和二级指针作为函数参数的区别 例子 int recvMsg(int cfd, char** msg) {if(msg NULL || cfd 0){ return -1;}// 接收数据// 1. 读数据头int len 0;readn(cfd, (char*)len, 4);len ntohl(len);printf(数据块大小: %d\n, len);// 根据读出的长度分配内存char *buf (char*)malloc(len1);int ret readn(cfd, buf, len);if(ret ! len){return -1;}buf[len] \0;*msg buf;return ret; } 在这个函数中二级指针msg被用作传出参数这是因为函数需要修改外部变量的值。在函数内部msg指向的内存被分配给了新的数据然后这个新的地址被赋值给了*msg。如果我们只使用一级指针作为参数那么在函数内部对指针的修改例如分配新的内存将不会影响到外部的指针因为函数参数是通过值传递的。 使用二级指针作为参数允许我们在函数内部修改一级指针的值即改变一级指针所指向的地址这样我们就可以将新分配的内存地址传递回函数的调用者。这就是为什么在这个函数中选择二级指针作为传出参数而不是一级指针。 如果你选择一级指针作为传出参数那么在函数内部对指针的修改例如分配新的内存将不会影响到外部的指针因为函数参数是通过值传递的。这就意味着即使你在函数内部为指针分配了新的内存这个新的内存地址也无法传递回函数的调用者。 下面是一个示例展示了如果使用一级指针作为传出参数会发生什么 void recvMsg(int cfd, char* msg) {// 假设len是通过某种方式获取的int len 100;// 分配内存char *buf (char*)malloc(len1);// 假设我们已经将数据读入buf// ...buf[len] \0;msg buf; // 这里只是修改了函数内部的msg副本对外部的msg没有影响 }int main() {char *str NULL;recvMsg(cfd, str);// 此时str仍然是NULL因为recvMsg函数内部对msg的修改并未影响到strreturn 0; }在上述代码中recvMsg函数接收一个一级指针msg作为参数。然而由于msg是通过值传递的所以在函数内部对msg的修改并不会影响到外部的str。这就是为什么在调用recvMsg(cfd, str)后str仍然是NULL。 100; // 分配内存 char buf (char)malloc(len1); // 假设我们已经将数据读入buf // … buf[len] ‘\0’; msg buf; // 这里只是修改了函数内部的msg副本对外部的msg没有影响 } int main() { char *str NULL; recvMsg(cfd, str); // 此时str仍然是NULL因为recvMsg函数内部对msg的修改并未影响到str return 0; } 在上述代码中recvMsg函数接收一个一级指针msg作为参数。然而由于msg是通过值传递的所以在函数内部对msg的修改并不会影响到外部的str。这就是为什么在调用recvMsg(cfd, str)后str仍然是NULL。
http://www.hkea.cn/news/14342046/

相关文章:

  • 怎么上国外购物网站怎么制作小程序卖东西
  • 自己做公司网站难吗哪里有手机网站建设联系方式
  • 网站用excel做数据库自己有服务器怎么做网站
  • 上海网站公司排名淄博亿泰
  • 豆芽网站建设彩票理财网站建设
  • 做网站需要学啥有没有好玩的网页游戏
  • 百度网站改版做网站应达到什么效果
  • 北京南站到北京西站运营推广的方式和渠道有哪些
  • 企业门户网站建设方案后台管理地方网站成本
  • 租用海外服务器的网站有域名吗网站开发怎么样?
  • 网站建设的功能模型seo基础知识包括什么
  • 网站优化的虚拟主机装2个wordpress
  • 单位网站建设方案北京中天人建设工程有限公司网站
  • 网站开发core文件作用上海闵行刚刚发生的
  • 网站怎么制作成软件iis搭建多个网站
  • 怎么做购物微信网站wordpress安装方法
  • 手机网站关键词快速排名个人网站备案可以做博客吗
  • 山西自助建站系统怎么用国外免费ip地址和密码
  • 北海建设厅网站东营在建项目
  • 网站设计制作的公司失效网站建设费支出
  • 网站页面设置手机版网站设计套餐
  • 网站开发团队 组建东阳网站建设
  • 网站建设开什么名目网站开发客户对话
  • 滕州微信网站获取别人wordpress主题
  • flash 做ppt的模板下载网站wordpress数据插件
  • 做企业的网站都要准备什么职业装定制
  • 少部分网站ie打不开这些网站域名ping不通做蔬菜线上的网站
  • 网上购物商城网站营销型网站建设ppt模板下载
  • 关于网站建设的介绍wordpress怎么使用阿里图标
  • 常德网站建设策划方案网站下拉菜单重叠