设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间01 现在时间01 缓存数据 当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

查看: 1959|回复: 5

c语言中的二级指针做函数参数说明

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:240
  • 打卡月天数:1
  • 打卡总奖励:3603
  • 最近打卡:2025-12-14 02:42:25
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
405
主题
385
精华
0
金钱
4856
积分
874
注册时间
2023-1-6
最后登录
2025-12-14

发表于 2023-2-13 11:41:28 | 显示全部楼层 |阅读模式
二级指针做函数参数

1.用指针做函数参数申请动态内存的问题
  1. //如果函数参数是指针,不能用一级指针做函数参数实现申请动态内存
  2.  
  3. void getMemory(char *p, int num)
  4. {
  5.     p = (char *)malloc(sizeof(char)*num);
  6. }
  7. void main()
  8. {
  9.     char *str = NULL;
  10.     getMemory(str, 20);
  11.     strcpy(str, "code");
  12.     cout << str;
  13.     system("pause");
  14. }//出错
  15. 然而
  16. //用二级指针为指针申请内存,用二级指针做函数参数可以申请成功
  17. void getMemory1(char **p, int num)
  18. {
  19.     *p = (char *)malloc(sizeof(char)*num);
  20. }
  21. void main()
  22. {
  23.     char *str = NULL;
  24.     getMemory(&str);
  25.     strcpy(str, "code");
  26.     cout << str;
  27.     system("pause");
  28. }
复制代码
2.二级指针做函数参数简介修改变量的值
  1. #include<iostream>
  2.  
  3. using namespace std;
  4. struct Teacher
  5. {
  6.     char name[20];
  7.     int age;
  8. };
  9. int getTeacher(Teacher **p)
  10. {
  11.     Teacher *tmp = NULL;
  12.     if (p == NULL)
  13.     {
  14.         return -1;
  15.     }
  16.     if (tmp == NULL)
  17.     {
  18.         return -2;
  19.     }
  20.     tmp->age = 23;
  21.     *p = tmp;//p是实参地址,*p间接修改实参的值
  22.     //用二级指针修改一级指针的值,用一级指针修改零级指针的值
  23. }
  24. void FreeTeacher(Teacher *p)
  25. {
  26.     if (p == NULL)
  27.     {
  28.         return;
  29.     }
  30.     free(p);
  31. }
  32. int main()
  33. {
  34.     Teacher *pt = NULL;
  35.     getTeacher(&pt);
  36.     cout << pt->age << endl;
  37.     FreeTeacher(pt);
  38.     system("pause");
  39.     return 0;
  40. }
复制代码
124242erlrk7k04v5vv582.jpeg


二级指针作为形参简单实例分析

指针是什么?指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。
举例
  1. int c=2,d=3;
  2. int *pc=&c;
复制代码
pc是指针变量的存储内容,也就是c的地址
*pc就是对指针的解引用,取出这个c这个地址里面的值

实例
  1. #include <stdio.h>int c=2,d=3;
  2. int *pc=&c;        //一级指针指向cint **ppc = &pc;    //二级指针指向一级指针pc    (指向指针的指针) int main(){        //一级指针*p指向c        printf("一级指针*p指向c\n\n");        printf("c的地址=%p      c的地址\n",&c);        printf("pc的值 =%p       pc中指向的就是C的地址\n",pc);        printf("*pc的值=%d              对c的地址进行取值*pc==2;\n",*pc);         putchar('\n');        printf("-------------------------------------------------------------\n");         //二级指针(指针的指针)**ppc指向*pc          printf("二级指针(指针的指针)**ppc指向*pc\n\n");        printf("pc的地址   =%p   一级指针pc的地址\n",&pc);                printf("ppc的值    =%p   二级指针ppc指向的地址其实就是一级指针pc的地址\n",ppc);                printf("*ppc的值   =%p   对ppc进行一次解引用,*ppc==pc,*ppc也就是c的地址\n",*ppc);          printf("*(*ppc)的值=%d          对ppc进行两次解引用,*(*ppc)==*pc==c==2\n",*(*ppc));         putchar('\n');        return 0;}
复制代码
运行结果为:
124242zcgxhg5fuzuuzuhj.png


一级指针二级指针做函数形参

许多初学者在使用一级指针的时候基本没什么问题
例如
  1. int a=10;
  2. int fun(int *p)
  3. {
  4.           return ( *p+=10);
  5. }
复制代码
在调用是时需要定义一个变量int b=fun(&a);
当二级指针做形参的时候,调用该函数时实参应该以什么格式填写?
  1. int a=1;
  2. int b=2;

  3. int fun1(int **p1,int *p2)//二级指针做形参   后面举例用
  4. {
  5.         return (**p1+*p2);
  6. }

  7. int fun2(int x,int y)
  8. {
  9.         return (x+y);
  10. }
复制代码
函数fun1的第一个形参是**p1 二级指针 , 第二个是*p2 ,  最终的目的是将两个变量相加
我们对比fun2, 这个函数的形参都是普通变量,调用时直接int sum=fun2(a,b),最终的目的是将两个变量相加.
通过对比,我们发现**p1代表一个变量,*p2也代表一个变量。
我们来分析下*p这个东西。
  1. int a=2;
  2. int b=3;
  3. int *p=&a;
复制代码
我们可以知道 p存放的值就是变量a的地址,*(地址)就相当于把这个地址的值取出来。
假如a的地址等于0x123456, p也==0x123456,   b=(*p)==*(a的地址)==a的值;通过这步b就等于2;
我们回到fun1函数,**p怎么才能转换 为一个变量呢,看下图
124242nkkkkgkr2rwjmkkg.png

一级指针只有一层解引用——*(地址)则得到一个变量,
二级指针内层解引用得到一个地址add2,对add2解引用得到一个变量  
  *(add1)=add2,*(add2)=变量 ——> *(*(add1))=变量
所以fun1的第一个实参应该填一个地址ADD1  对ADD1解引用得到ADD2,对ADD2解引用得到一个变量

下面看看实例
  1. #include <stdio.h>int c=2,d=3;
  2. int *pc=&c;int **ppc = &pc;int fun1(int **p1,int *p2)//二级指针做形参   后面举例用{        return (**p1+*p2);} int main(){                int sum=fun1(&pc,&d);//在二级指针形参填写一个指针的地址,这个指针指向一个变量         printf("sum=%d\n",sum);         putchar('\n');        printf("------------------------------------------\n");         printf("      c的地址=%p\n",&c);        printf(" pc指向的地址=%p\n",pc);        printf("          *pc=%d\n",*pc);         putchar('\n');        printf("------------------------------------------\n");         printf("         c的地址=%p\n",&c);        printf("    pc指向的地址=%p\n",pc);        printf("        pc的地址=%p\n",&pc);         putchar('\n');        printf("------------------------------------------\n");         printf("   ppc指向的地址=%p\n",ppc);        printf("    *(ppc)的地址=%p\n",*(ppc));        printf("   **(ppc)的值=%d\n",**(ppc));        putchar('\n');        return 0;}
复制代码
124243aa44uuel4pwwvbkv.png

解析一下程序二级指针的流程
124243cqahzqzmqzt0mg38.png

三级指针或者多级指针以此类推,凡是涉及到指针解引用的*(x),x都是一个地址。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持晓枫资讯。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:22
  • 打卡月天数:0
  • 打卡总奖励:285
  • 最近打卡:2025-11-17 08:19:42
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
328
积分
46
注册时间
2023-3-6
最后登录
2025-11-17

发表于 2023-8-13 17:41:07 | 显示全部楼层
感谢楼主分享~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
11
积分
2
注册时间
2023-6-11
最后登录
2023-6-11

发表于 2024-1-10 22:36:58 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
11
积分
2
注册时间
2023-12-18
最后登录
2023-12-18

发表于 2024-1-22 08:27:53 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
19
积分
18
注册时间
2022-12-28
最后登录
2022-12-28

发表于 2025-7-27 00:51:01 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:16
  • 最近打卡:2024-12-25 21:33:59
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
28
积分
4
注册时间
2023-6-2
最后登录
2024-12-25

发表于 2025-10-12 02:40:47 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼
6楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表