【C语言】指针的指针使用场景

前言

C 语言中,比较难理解的就是指针,完全搞懂了指针,那么C语言算是入了门。

指针中比较难理解的概念: 指针的指针

指针的指针,刚开始看到这个概念,感觉头疼。但是我们在程序里面应用一次就能搞懂。

本文通过使用指针的指针变量作为函数参数 获取一个内存地址,来理解指针的指针


1 . 指针作为函数参数

先来看一下 指针作为参数的作用

如果想要获取函数获取一个值,有两种方式:

(a)通过函数返回值,即return 返回值,一般最常用的。

(b)通过函数参数返回。

下面两个函数都设法通过函数参数 返回int型 数值 3,哪个函数能成功?

c 复制代码
int i=0;
// 将参数V的值 变成3
void newInt(int v)
{
	v=3;
}
//将参数V的 变成3
void newInt2(int * v)
{
	*v = 3;
}

调用这两个函数测试一下

c 复制代码
//指针的指针到底是干嘛用的呢。
#include <stdio.h>


// 将参数V的值 变成3
void newInt(int v)
{
	v=3;
}


//将参数V的 变成3
void newInt2(int * v)
{
	*v = 3;
	
}


int main()
{

	int i=0;
	printf("\n整型变量i的初始值    :%3d",i);
	newInt(i);
	printf("\n\n调用newInt()后的i值  :%3d",i);
	newInt2(&i);
	printf("\n\n调用newInt2()后的i值 :%3d",i);
	getchar();

	return 0;
}

这里得出一个结论:

想要改变整型参数的值,必须传递 整型指针。

同理我们可以推断结论:

想要改变整型地址(整型指针)参数的值,必须传递必须传递 整型指针的指针。


下面来验证一下

2. 指针的指针 作为函数参数

同样定义两个函数 void newIntPtr(int * v)和 void newIntPtr2( int **v):

c 复制代码
//给参数v 获取一个新的内存地址
void newIntPtr(int * v)
{
   v = (int *)malloc(sizeof(int));;
   
}

//给参数v 获取一个新的内存地址
void newIntPtr2( int **v)
{
   *v = (int *) malloc(sizeof(int));
}

这两个函数哪一个能够成功的修改参数v的地址?

测试代码如下:

c 复制代码
//指针的指针到底是干嘛用的呢。
#include <stdio.h>



//给参数v 获取一个新的内存地址
void newIntPtr(int * v)
{
	v = (int *)malloc(sizeof(int));;
	
}

//给参数v 获取一个新的内存地址
void newIntPtr2( int **v)
{
	*v = (int *) malloc(sizeof(int));
}


int main()
{
	int i=0;
	int * address= &i; //使用i的地址 初始化address
	printf("\n整型指针变量address的初始值 :%p",address);
	newIntPtr(address); //实际上这样使用,是错误的,因为在函数内部申请的地址,没有地方释放。
	printf("\n\n调用newIntPtr2后的address值 :%p",address);
	newIntPtr2(&address);
	printf("\n\n调用newIntPtr2后的address值 :%p",address);
	free(address); //释放address的内存
	getchar();

	return 0;
}
相关推荐
杨荧7 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
白子寰13 分钟前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
王俊山IT26 分钟前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
为将者,自当识天晓地。28 分钟前
c++多线程
java·开发语言
小政爱学习!30 分钟前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript
k09331 小时前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
神奇夜光杯1 小时前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
Themberfue1 小时前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
plmm烟酒僧1 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
EricWang13581 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端