这篇文章主要介绍了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++使用模板特化功能 2023-03-05
- C++中的atoi 函数简介 2023-01-05
- C利用语言实现数据结构之队列 2022-11-22
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26
- 一文带你了解C++中的字符替换方法 2023-07-20
- C语言基础全局变量与局部变量教程详解 2022-12-31
- 详解c# Emit技术 2023-03-25
- C++详细实现完整图书管理功能 2023-04-04
- C/C++编程中const的使用详解 2023-03-26
- C语言 structural body结构体详解用法 2022-12-06