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

目录

  • 二级指针做函数参数
  • 二级指针作为形参简单实例分析
    • 实例
    • 一级指针二级指针做函数形参
    • 下面看看实例

二级指针做函数参数 1.用指针做函数参数申请动态内存的问题
//如果函数参数是指针,不能用一级指针做函数参数实现申请动态内存 void getMemory(char *p, int num){p = (char *)malloc(sizeof(char)*num); }void main(){char *str = NULL; getMemory(str, 20); strcpy(str, "code"); cout << str; system("pause"); }//出错然而//用二级指针为指针申请内存,用二级指针做函数参数可以申请成功void getMemory1(char **p, int num){*p = (char *)malloc(sizeof(char)*num); }void main(){char *str = NULL; getMemory(&str); strcpy(str, "code"); cout << str; system("pause"); }

2.二级指针做函数参数简介修改变量的值
#include using namespace std; struct Teacher{char name[20]; int age; }; int getTeacher(Teacher **p){Teacher *tmp = NULL; if (p == NULL){return -1; }if (tmp == NULL){return -2; }tmp->age = 23; *p = tmp; //p是实参地址,*p间接修改实参的值//用二级指针修改一级指针的值,用一级指针修改零级指针的值}void FreeTeacher(Teacher *p){if (p == NULL){return; }free(p); }int main(){Teacher *pt = NULL; getTeacher(&pt); cout << pt->age << endl; FreeTeacher(pt); system("pause"); return 0; }

c语言中的二级指针做函数参数说明
文章图片


二级指针作为形参简单实例分析 【c语言中的二级指针做函数参数说明】指针是什么?指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。
举例
int c=2,d=3; int *pc=&c;

pc是指针变量的存储内容,也就是c的地址
*pc就是对指针的解引用,取出这个c这个地址里面的值

实例
#include int c=2,d=3; int *pc=&c; //一级指针指向cint **ppc = &pc; //二级指针指向一级指针pc(指向指针的指针) int main(){ //一级指针*p指向c printf("一级指针*p指向c\n\n"); printf("c的地址=%pc的地址\n",&c); printf("pc的值 =%ppc中指向的就是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; }

运行结果为:
c语言中的二级指针做函数参数说明
文章图片


一级指针二级指针做函数形参
许多初学者在使用一级指针的时候基本没什么问题
例如
int a=10; int fun(int *p){return ( *p+=10); }

在调用是时需要定义一个变量int b=fun(&a);
当二级指针做形参的时候,调用该函数时实参应该以什么格式填写?
int a=1; int b=2; int fun1(int **p1,int *p2)//二级指针做形参后面举例用{ return (**p1+*p2); } int fun2(int x,int y){ return (x+y); }

函数fun1的第一个形参是**p1 二级指针 , 第二个是*p2 ,最终的目的是将两个变量相加
我们对比fun2, 这个函数的形参都是普通变量,调用时直接int sum=fun2(a,b),最终的目的是将两个变量相加.
通过对比,我们发现**p1代表一个变量,*p2也代表一个变量。
我们来分析下*p这个东西。
int a=2; int b=3; int *p=&a;

我们可以知道 p存放的值就是变量a的地址,*(地址)就相当于把这个地址的值取出来。
假如a的地址等于0x123456, p也==0x123456,b=(*p)==*(a的地址)==a的值; 通过这步b就等于2;
我们回到fun1函数,**p怎么才能转换 为一个变量呢,看下图
c语言中的二级指针做函数参数说明
文章图片

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

下面看看实例
#include int c=2,d=3; 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; }

c语言中的二级指针做函数参数说明
文章图片

解析一下程序二级指针的流程
c语言中的二级指针做函数参数说明
文章图片

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

    推荐阅读