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

 更新时间:2022年05月10日 08:44:48   作者:生活甜甜好运连连  
这篇文章主要介绍了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<iostream>
 
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;
}

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

指针是什么?指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。

举例

int c=2,d=3;
int *pc=&c;

pc是指针变量的存储内容,也就是c的地址

*pc就是对指针的解引用,取出这个c这个地址里面的值

实例

#include <stdio.h>
int c=2,d=3;
int *pc=&c;        //一级指针指向c
int **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;
}

运行结果为:

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

许多初学者在使用一级指针的时候基本没什么问题

例如

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怎么才能转换 为一个变量呢,看下图

一级指针只有一层解引用——*(地址)则得到一个变量,

二级指针内层解引用得到一个地址add2,对add2解引用得到一个变量  

  *(add1)=add2,*(add2)=变量 ——> *(*(add1))=变量

所以fun1的第一个实参应该填一个地址ADD1  对ADD1解引用得到ADD2,对ADD2解引用得到一个变量

下面看看实例

#include <stdio.h>
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;
}

解析一下程序二级指针的流程

三级指针或者多级指针以此类推,凡是涉及到指针解引用的*(x),x都是一个地址。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 简述C++中虚拟函数的内存分配机制

    简述C++中虚拟函数的内存分配机制

    这篇文章主要介绍了简述C++中虚拟函数的内存分配机制,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • OpenCV实现可分离滤波

    OpenCV实现可分离滤波

    这篇文章主要为大家详细介绍了OpenCV实现可分离滤波,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C语言实现父进程主动终止子进程的方法总结

    C语言实现父进程主动终止子进程的方法总结

    一般的情况,子进程自己运行完后,执行exit 或者return 后,父进程wait.  waitpid收回子进程,但子进程是一个循环等待状态不主动退出,父进程可以采用文中介绍的几种方法,需要的朋友可以参考下
    2023-10-10
  • c语言 汉诺塔算法代码

    c语言 汉诺塔算法代码

    c语言 汉诺塔算法代码,需要的朋友可以参考一下
    2013-04-04
  • C语言实现水波纹效果

    C语言实现水波纹效果

    这篇文章主要为大家详细介绍了C语言实现水波纹效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 利用C++实现双链表基本接口示例代码

    利用C++实现双链表基本接口示例代码

    双链表:在单链表的每个结点中,再设置一个指向其前驱结点的指针域,下面这篇文章主要给大家介绍了关于利用C++实现双链表基本接口的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • C++中的不规则二维数组实现代码

    C++中的不规则二维数组实现代码

    本文介绍了一个在C++中保存不定长二维数组的数据结构,在这个结构中,我们使用了一个含有指针和数组长度的结构体,用这样的一个结构体构造一个结构体数组,用于存储每一个不定长的数组,感兴趣的朋友一起看看吧
    2024-03-03
  • C++深浅拷贝及简易string类实现方式

    C++深浅拷贝及简易string类实现方式

    这篇文章主要介绍了C++深浅拷贝及简易string类实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 浅谈QT打包的两种方式

    浅谈QT打包的两种方式

    本文主要介绍了浅谈QT打包的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • QT网络编程UDP下C/S架构广播通信(实例讲解)

    QT网络编程UDP下C/S架构广播通信(实例讲解)

    下面小编就为大家带来一篇QT网络编程UDP下C/S架构广播通信(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论